这种排序有什么名字吗?

时间:2019-05-11 23:48:33

标签: c algorithm sorting

我写/使用过这种排序方式。我只是想知道它是否有任何名称或与任何现有的排序算法相似。顺便说一句,它甚至有效/有价值还是不正确?

int s = 20;

int unsorted_array[s];

//(adding numbers to unsorted_array)
//We assume that every number is different to avoid any difficulties.

int i, i2, pos;
int sorted_array[s];

//!!! sorting algo starts here:

for(i=0; i<s; i++){
   pos = 0;
   for(i2=0; i2<s; i2++){

      if(unsorted_array[i] > unsorted_array[i2]){
         pos += 1;
      }
   }

   sorted_array[pos] = unsorted_array[i];

}

那你怎么看?比其他种类的分类方法慢/快吗?我还在学习。感谢您的任何答复!

3 个答案:

答案 0 :(得分:5)

  

它比其他种类的排序方法慢/快吗?

让我们分析the time complexity of this function。随着未排序列表的大小增长,它将需要做多少工作?

重要的部分是循环。他们会告诉我们您需要执行多少次操作,这很重要。您的循环可细分为:

for(1 to s){
   for(1 to s){
       do that thing
   }
}

对于每个元素,必须重新检查每个元素。如果有2个项目,则意味着您执行了4次操作。 3项,9次。 4项,16倍。我们说时间复杂度是n^2n是大小的约定),因为随着大小的增加,步数将平方。这意味着所需的时间将随着大小的增加而呈指数增长。 10件物品要花100倍。每100件物品需要10,000。以1,000为单位,需要1,000,000。尽量避免使用n^2

Most sorting algorithms可以在n * log(n)或准线性时间内完成工作。随着大小的增加,时间将增加n * log(n)。这比线性快,但比指数慢。 log(n)通常是natural logarithmln(n)。如果是10件商品,则大约需要23次。 100约460。1000约6900。所以您的算法较慢。

enter image description here

n * log(n)之上的算法增长如此之快,因此有必要扭曲垂直时标,以通过性能更好的算法将它们合理地拟合在同一张图中。

您可能会猜到,对于大量项目,拥有更好性能的算法比更快地完成工作更为重要。一种n^2算法执行的工作比n log n快100倍,它将损失大约600项。

n^2 = 100 n * ln(n)
n = 100 ln(n)
n / ln(n) = 100

答案 1 :(得分:3)

在我看来,这就像某种反向选择排序。选择排序将说“什么元素在位置0?”然后找到该元素。您的排序似乎是在说“当前位置0的元素在哪里?”,这是一个同样有效的问题。

就复杂性而言,绝对是O(n^2),这使其与其他“低效”方案(如插入,选择,冒泡等)相提并论,并将其置于诸如合并之类的更为复杂的“更好”方案之下或快速。我最关心的是,您实际上在迭代n^2次,而诸如插入或选择之类的算法可以避免使用n (n + 1) / 2(三角形的数字,而不是正方形的数字),是相同的复杂度类别,但总体数量较少。同样,您的排序要求我们在内存中提供一个新的数组,而许多现有的数组(尤其是插入和选择,因为它们与您的数组很接近)可以在恒定空间中完成而无需分配任何空间更多数组。

答案 2 :(得分:1)

这可以通过为数组中的每个元素查找少于它的元素数量来实现。这等同于找到其最终位置。

O(n*n)比较慢(有不错的O(n*lg(n))算法)。但是,这里有很多O(n*n)排序算法,因此您的公司很好。

它也仅适用于唯一值,这是一个非常严格的限制。

它还需要第二个数组将其复制到其中,大多数排序算法都不需要,因此这是另一个缺点。

从好的方面来说,它的交换次数为零,而实际副本数量很少(实际上是n,这在某些情况下可能是件好事,但这是一个很小的加分点。) >