java 堆排序与合并排序的速度[重复]

k10s72fa  于 2022-12-28  发布在  Java
关注(0)|答案(2)|浏览(123)
    • 此问题在此处已有答案**:

Quicksort superiority over Heap Sort(6个答案)
四年前关闭了。
迭代大型数组时,哪种算法更快:堆排序还是合并排序?为什么其中一个算法比另一个快?

rekjcdws

rekjcdws1#

虽然时间复杂度是一样的,但常数因素是不同的。一般来说,合并排序在具有4路或更多路缓存的典型系统上要快得多,因为合并排序将执行两次运行的顺序读取和对一次合并运行的顺序写入。我记得用C编写的合并排序比用汇编编写的优化堆排序快。
一个问题是堆排序交换数据,即每次交换两次读取和两次写入,而合并排序移动数据,每次移动一次读取和一次写入。
合并排序的主要缺点是需要与原始数组大小相同的第二个数组(或向量)(或原始数组大小的1/2)作为工作存储,在具有4 GB或更大RAM的PC上,这通常不是问题。
在我的系统上,Intel 3770 K 3.5 ghz,Windows 7 Pro 64位,Visual Studio 2015,要对2^24 = 16,777,216个64位无符号整数进行排序,堆排序需要7.98秒,而自下而上合并排序需要1.59秒,自上而下合并排序需要1.65秒。

oxf4rvwz

oxf4rvwz2#

两种排序方法具有相同的时间复杂度,并且是最佳的。在合并排序中合并所需的时间被在堆排序中构建堆所需的时间抵消。合并排序需要额外的空间。堆排序可以使用额外的空间来实现,但并不需要额外的空间。然而,堆排序是不稳定的。因为它不能保证“equal”元素不变。如果你在相同的条件下公平地测试这两个方法,差异将是最小的。

相关问题