堆排序与合并排序的速度对比

Heap Sort vs Merge Sort in Speed

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

两种排序方法的时间复杂度相同,都是最优的。在合并排序中合并所需的时间与在堆排序中构建堆所需的时间相抵消。合并排序需要额外的 space。 heapsort 可以使用额外的 space 来实现,但并不需要它。然而,堆排序是不稳定的,因为它不能保证 'equal' 元素保持不变。如果您在相同条件下公平地测试这两种方法,差异将很小。

取自here

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

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

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

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