鉴于输入将是从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;
}
不要求稳定排序。
编辑:如果不清楚,我说的是优化算法。
答案 0 :(得分:1)
恕我直言,这里没有错。当max_element很小时,我强烈推荐这种方法,排序的数字是非稀疏的(即连续且无间隙)且大于或等于零。
一个小小的调整,我将替换new / delete并使用堆声明一个有限数组,例如: max_element为256。
int CountArr[256] = { }; // Declare and initialize with zeroes
当你弯曲这些规则时,即稀疏的负数,你就会在这种方法上挣扎。您需要找到最佳散列函数,以将数字重新映射到高效数组。散列越复杂,这种完善的排序算法之间的好处就越少。
答案 1 :(得分:1)
就复杂性而言,这不能被打败。它是O(N)
并通过利用O(NlogN)
的额外知识击败标准0<x<N
排序。您不能低于O(N)
,因为您至少需要刷一次输入数组。