繁体   English   中英

优化计数排序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM