在遍历大型数组时,哪种算法更快:堆排序或合并排序?为什么其中一种算法比另一种算法快?
答案 0 :(得分:2)
尽管时间复杂度相同,但恒定因素却不同。通常,在具有4或更大方式高速缓存的典型系统上,合并排序将明显更快,因为合并排序将执行两次运行的顺序读取,以及对单个合并运行的顺序写入。我记得用C语言编写的合并排序比用汇编语言编写的优化堆排序要快。
一个问题是堆排序交换数据,即每个交换两次读取和两次写入,而合并排序移动数据,一次移动一次读取和一次写入。
合并排序的主要缺点是在4 GB或更大容量的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秒。
答案 1 :(得分:0)
这两种排序方法都具有相同的时间复杂度,并且是最佳的。在合并排序中合并所需的时间与在堆排序中构建堆所需的时间相抵消。合并排序需要更多空间。可以使用额外的空间来实现堆排序,但不需要它。但是,Heapsort不稳定,因为它不能保证将“相等”元素保持不变。如果您在相同条件下公平地测试这两种方法,则差异将很小。
取自here