试图理解Counting排序的复杂性

时间:2012-03-13 16:17:32

标签: c sorting big-o time-complexity counting-sort

阅读各种各样的。在Counting排序的情况下,下面的C代码工作正常,但我对其时间复杂度有疑问。我在很多地方读的并不是O(N),而是O(输入数组的最大值 - 数组的最小值)。现在,如果我们增加N,同时增加max - min(范围 - 即增加最大值和减小min),则运行时复杂度可以得到二次方,即O(N 2 )或没有?或者,如果输入数组具有相同值的多个实例,则这种情况可能是最坏的情况。试图理解并不是很清楚。

假设我们计算了传递给counting_sort的给定数组的最小值,最大值。 n是输入数组的长度

void counting_sort_mm(int *array, int n, int min, int max)
{
  int i, j, z;

  int range = max - min + 1;
  int *count = malloc(range * sizeof(*array));

  for(i = 0; i < range; i++) count[i] = 0;
  for(i = 0; i < n; i++) count[ array[i] - min ]++;

  for(i = min, z = 0; i <= max; i++) {
    for(j = 0; j < count[i - min]; j++) {
      array[z++] = i;
    }
  } 

  free(count);
}

1 个答案:

答案 0 :(得分:0)

对输入数组中的特定值没有任何进一步的假设,计数排序的运行时间为O(n + U),其中U是您称为max - min的值。除非您有理由相信,否则数量n和U彼此独立。

现在,由于特定应用的特定原因,很可能是阵列中的最大值最多为n 2 且最小值值为0,在这种情况下U = O(n 2 )。在这种情况下,计数排序的运行时确实是O(n 2 )。这实际上在实践中发生了相当大的数量。