优化计数排序

Optimize counting sort?

本文关键字:排序 优化      更新时间:2023-10-16

鉴于输入将是从 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 表示max_element。

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

当你弯曲这些规则时,即稀疏的负数,你会在这种方法上挣扎。您需要找到一个最佳的哈希函数来将数字重新映射到您的高效数组。哈希越复杂,这种完善的排序算法之间的好处就会减少。

就复杂性而言,这是无法击败的。它O(N),并通过利用0<x<N的额外知识来击败标准O(NlogN)排序。您不能低于O(N),因为您至少需要轻扫一次输入数组。