优化计数排序
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 并使用堆声明一个有限数组,例如 256 表示max_element。
int CountArr[256] = { }; // Declare and initialize with zeroes
当你弯曲这些规则时,即稀疏的负数,你会在这种方法上挣扎。您需要找到一个最佳的哈希函数来将数字重新映射到您的高效数组。哈希越复杂,这种完善的排序算法之间的好处就会减少。
就复杂性而言,这是无法击败的。它O(N)
,并通过利用0<x<N
的额外知识来击败标准O(NlogN)
排序。您不能低于O(N)
,因为您至少需要轻扫一次输入数组。
相关文章:
- 空基优化子对象的地址
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 排序优化
- 快速排序实现优化
- 由于优化而重新排序代码
- 如何优化间接基数排序?(又名如何优化不可预测的内存访问模式)
- 优化计数排序
- 涉及编译器重新排序的优化示例
- C++快速排序透视优化
- 是否使用 Guard 类免受编译器优化和 CPU 重新排序的影响
- visual编译器指令在C++中重新排序优化(以及禁止它们的原因)
- 如何优化随机排序算法
- 排序优化时间
- C/ c++编译器会对交换运算符(例如:+,*)重新排序以优化常量吗?
- 优化冒泡排序-我错过了什么
- 插入排序优化
- 冒泡排序优化c++