优化计数排序?

时间:2016-03-19 20:52:08

标签: c++ algorithm

鉴于输入将是从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;
}

不要求稳定排序。

编辑:如果不清楚,我说的是优化算法。

2 个答案:

答案 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),因为您至少需要刷一次输入数组。