堆排序与合并排序的速度

Hen*_*ang 3 java sorting mergesort heapsort

迭代大型数组时,哪种算法更快:堆排序还是归并排序?为什么这些算法中的一种比另一种更快?

rcg*_*ldr 7

尽管时间复杂度相同,但常数因子却不同。通常,在具有 4 路或更多路缓存的典型系统上,合并排序会明显更快,因为合并排序将从两次运行执行顺序读取,并顺序写入单个合并运行。我记得用 C 编写的合并排序比用汇编编写的优化堆排序快。

一个问题是堆排序交换数据,即每次交换两次读取和两次写入,而合并排序移动数据,每次移动一次读取和一次写入。

归并排序的主要缺点是在具有 4 GB 或更多 RAM 的 PC 上,工作存储需要与原始大小相同的第二个数组(或向量)(或可选地为原始大小的 1/2),这通常不是问题。

在我的系统上,Intel 3770K 3.5 ghz,Windows 7 Pro 64 位,Visual Studio 2015,对 2^24 = 16,777,216 64 位无符号整数进行排序,堆排序需要 7.98 秒,而自底向上归并排序需要 1.59 秒,自顶向下归并排序需要1.65 秒。

  • @Henry Wang:Q:所以最终还是要看系统。A: *NOOO!!!!!!* 它实际上取决于*许多*事物,*包括*系统约束(如内存)、设置顺序(部分排序?)等。 建议:在此处查看一些图形比较[排序算法动画](https://www.toptal.com/developers/sorting-algorithms) (2认同)