快速排序与合并排序

时间:2009-03-25 07:26:23

标签: algorithm sorting

为什么快速排序比合并排序更好?

11 个答案:

答案 0 :(得分:105)

请参阅Quicksort on wikipedia

  

通常,快速排序显着   实践中比其他Θ更快(nlogn)   算法,因为它的内循环可以   大多数人都能有效地实施   架构,在大多数现实世界中   数据,可以进行设计   最小化概率的选择   要求二次时间。

请注意,非常低的内存要求也是一个很大的优势。

答案 1 :(得分:72)

当数据存储在内存中时,快速排序通常比合并排序更快。但是,当数据集很大并且存储在外部设备(如硬盘驱动器)上时,合并排序在速度方面是明显的赢家。它最大限度地减少了外部驱动器的昂贵读取,同时也很适合并行计算。

答案 2 :(得分:61)

对于合并排序,最差情况为O(n*log(n)),对于快速排序:O(n 2 )。对于其他情况(平均,最好),都有O(n*log(n))。但是,快速排序是空间常量,其中合并排序取决于您要排序的结构。

请参阅this comparison

您还可以看到它visually

答案 3 :(得分:11)

虽然快速排序通常是比合并排序更好的选择,但合并排序肯定是更好的选择。最明显的时间是,你的算法运行速度比O(n ^ 2)更重要。 Quicksort通常比这更快,但是考虑到理论上最差的输入,它可以在O(n ^ 2)中运行,这比最差的可能合并排序更糟。

Quicksort也比mergesort更复杂,特别是如果你想编写一个非常可靠的实现,所以如果你的目标是简单性和可维护性,那么合并排序将成为一种很有前途的替代方案,而且性能损失很小。

答案 4 :(得分:11)

我个人想亲自测试快速排序和合并排序之间的区别,并查看1,000,000个元素样本的运行时间。

Quick sort was able to do it in 156 millisecondsMerge sort did the same in 247 milliseconds

然而,快速排序数据是随机的,如果数据是随机的,则快速排序表现良好,因为不是合并排序的情况,即合并排序在数据排序与否时无关地执行。 但是合并排序需要一个完整的额外空间,快速排序不需要就地排序

我已经为他们编写了全面的工作程序,也会有说明性的图片。

答案 5 :(得分:6)

除了其他之外:合并排序对于链接列表等不可变数据结构非常有效,因此是(纯粹)函数式编程语言的不错选择。

执行不当的快速排序可以是security risk

答案 6 :(得分:5)

Quicksort已经到位。您只需在分区功能期间交换数据位置。 Mergesort需要更多的数据复制。您需要另一个临时存储(通常 与合并函数相同的大小(原始数据数组)。

答案 7 :(得分:3)

快速排序的名称是有原因的,

亮点: 两者都是稳定的排序(简单地说是实施麻烦),所以让我们继续讨论复杂性

只有大量的符号被泄漏和“被滥用”才非常令人困惑,两者的平均案例复杂度均为0(nlogn),

但是合并排序总是0(nlogn),而坏分区的快速排序,即1个元素-10元素的偏斜分区(可能由于排序或反向排序列表而发生)可能导致0(n ^ 2) ..

..所以我们随机化了快速排序,我们随机选择了枢轴并避免了这种偏斜的分区,从而使整个n ^ 2场景无效 无论如何,即使是像3-4这样的适度倾斜分区,我们也有一个nlog(7/4)n, 理想情况下,我们想要1-1分,因此整个O(nlog(2)n)。

所以它是O(nlogn),几乎总是和合并排序不同,隐藏在“big-oh”表示法下的常量对于quicksort比对mergesort更好..并且它不会占用额外的空间,如合并排序。

但快速完成快速运行需要调整,改写,快速排序为您提供调整的机会....

答案 8 :(得分:3)

对于使用DualPivotQuickSort为原始值带来的变化,答案会略微倾向于快速输入w.r.t.它在 JAVA 7 中用于排序 java.util.Arrays

It is proved that for the Dual-Pivot Quicksort the average number of
comparisons is 2*n*ln(n), the average number of swaps is 0.8*n*ln(n),
whereas classical Quicksort algorithm has 2*n*ln(n) and 1*n*ln(n)
respectively. Full mathematical proof see in attached proof.txt
and proof_add.txt files. Theoretical results are also confirmed
by experimental counting of the operations.

您可以在此处找到JAVA7建议 - http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Arrays.java

关于DualPivotQuickSort的进一步精彩阅读 - http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/2628

答案 9 :(得分:2)

快速排序更好是不正确的。另外,这取决于你的意思,内存消耗或速度。

就内存消耗而言,在最坏的情况下,快速排序可以使用n ^ 2内存(即每个分区是1到n-1),而合并排序使用nlogn。

以上就速度而言。

答案 10 :(得分:0)

Quicksort已经到位。你需要很少的额外内存。这非常重要。

中位数的良好选择使其更有效率,但即使是中位数保证Theta(nlogn)的错误选择。