c++ - 优化计数排序?

标签 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;
}

不需要稳定的排序。

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

最佳答案

恕我直言,这里没有任何问题。当 max_element 很小、排序的数字非稀疏(即连续且没有间隙)并且大于或等于零时,我强烈推荐这种方法。

一个小调整,我将替换 new/delete 并仅使用堆声明一个有限数组,例如最大元素为 256。

int CountArr[256] = { }; // Declare and initialize with zeroes

当你改变这些规则时,即稀疏的负数,你会很难适应这种方法。您需要找到一个最佳的哈希函数来将数字重新映射到高效的数组。散列变得越复杂,与成熟的排序算法相比的优势就会减少。

关于c++ - 优化计数排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36107004/

相关文章:

从数组 A 中找到加起来为数字 B 的最短数字序列的算法

c++ - 如何使用 CMake 在特定构建配置中为特定目标设置特定编译器标志?

c++ - 如何在 Qt 中使用自定义标题栏 move 窗口

algorithm - 紧凑的数据结构,如集合

algorithm - 具有不同指数项的方程式的 FFT

algorithm - 定时同步

c++ - 双参数和 move 语义

c++ - 在外部类中使用类模板时如何定义内部类构造函数?

c++ - 在专门化之前使用模板?

python - 如何从边缘列表创建 python-igraph 图