阅读各种。在计数排序的情况下,下面的 C 代码可以正常工作,但我对它的时间复杂度有疑问。正如我在很多地方读到的那样,它并不是真正的 O(N),而是 O(输入数组的最大值 - 数组的最小值)。这可以大于 N。现在如果我们增加 N,同时增加 max - min(范围 - 即增加 max 并减少 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);
}