尽管时间复杂度相同,但常数因子却不同。通常,在具有 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 秒。