[英]Optimize counting sort?
鉴于输入将是从 0 到 N 的 N 个数字(有重复),我如何为小数组和大数组优化下面的代码:
void countingsort(int* input, int array_size)
{
int max_element = array_size;//because no number will be > N
int *CountArr = new int[max_element+1]();
for (int i = 0; i < array_size; i++)
CountArr[input[i]]++;
for (int j = 0, outputindex = 0; j <= max_element; j++)
while (CountArr[j]--)
input[outputindex++] = j;
delete []CountArr;
}
具有稳定的排序不是必需的。
编辑:如果不清楚,我说的是优化算法。
恕我直言,这里没有错。 当 max_element 很小,排序的数字非稀疏(即连续且没有间隙)并且大于或等于零时,我强烈推荐这种方法。
一个小的调整,我会替换 new / delete 并使用堆声明一个有限数组,例如 max_element 为 256。
int CountArr[256] = { }; // Declare and initialize with zeroes
当你改变这些规则时,即稀疏的负数,你会用这种方法挣扎。 您需要找到一个最佳散列函数来将数字重新映射到您的高效数组。 散列越复杂,这种优于完善的排序算法的好处就越小。
就复杂性而言,这是不可战胜的。 它是O(N)
并且通过利用0<x<N
的额外知识击败了标准的O(NlogN)
排序。 您不能低于O(N)
因为您至少需要在输入数组中滑动一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.