快速sorting与合并sorting

为什么快速sorting比合并sorting更好?

请参阅wikipedia上的Quicksort :

通常,快速sorting在实践中比其他Θ(nlogn)algorithm明显更快,因为其内部循环可以在大多数架构上有效地实现,并且在大多数现实世界的数据中,可以进行deviseselect,使得需要二次时间。

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

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

对于合并sorting,最坏情况是O(n*log(n)) ,对于快速sorting: O(n 2 ) 。 对于其他情况(平均,最好)都有O(n*log(n)) 。 然而,快速sorting是空间常量,合并sorting取决于您正在sorting的结构。

看这个比较 。

你也可以直观的看到它。

我个人想testing快速sorting和合并sorting之间的区别,看到了一百万个元素的运行时间。

快速sorting能够在156毫秒内完成,而合并sorting在247毫秒内完成

然而,快速sorting数据是随机的,如果数据是随机的,快速sortingperformance良好,而不是合并sorting的情况,即当数据sorting或不sorting时,合并sorting执行不变。 但合并sorting需要一个完整的额外空间,而快速sorting并不是一个就地sorting

我为他们写了全面的工作程序也将说明图片。

尽pipe快速sorting通常是比合并sorting更好的select,但合并sorting的确是一个更好的select。 最明显的时候是你的algorithm运行速度比O(n ^ 2)更重要。 快速sorting通常比这更快,但由于理论上最糟糕的可能input,它可能运行在O(n ^ 2),这比最糟糕的可能的合并sorting更糟糕。

Quicksort也比mergesort更复杂,特别是如果你想写一个真正的实现,所以如果你的目的是简单和可维护性,合并sorting成为一个很有前途的select,性能损失很less。

除了其他之外:合并sorting对于不可变的数据结构(如链表)非常有效,因此是(纯粹的)函数式编程语言的一个好select。

执行不力的快速sorting可能是一个安全风险 。

快速sorting到位。 你只需要在分区function中交换数据的位置。 Mergesort需要更多的数据复制。 对于合并function,您需要另一个临时存储(通常与原始数据arrays的大小相同)。

快速sorting是这样命名的,

亮点:两者都是稳定的sorting,(简单的执行滋扰),所以让我们继续复杂

它很容易混淆,只是大的符号被泄漏和“滥用”,均具有0(nlogn)的复杂度,

但合并sorting始终为0(nlogn),而快速sorting错误分区,即像1元素-10元素(可能发生归因于sorting或反向sorting列表)可能会导致0(n ^ 2)..

..所以我们有随机快速sorting,在那里我们随机select枢轴,避免这样的偏斜分割,从而无视这个整体n ^ 2情景,即使是适度偏斜分割像3-4,我们有一个nlog(7/4)n ,理想情况下我们要1-1分,因此O(nlog(2)n)的整个2。

所以它是O(nlogn),几乎总是和合并sorting不同,隐藏在“big-oh”符号下的常量对于quicksort比mergesort更好,并且不会像合并sorting那样占用额外的空间。

但快速sorting运行完美需要调整,换句话说,快速sorting为您提供机会调整….

答案会稍微倾向于使用DualPivotQuickSort为原始值带来的更改。 它在JAVA 7中用于在java.util.Arrays中进行sorting

 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. 

你可以在这里findJAVA7 implmentation – 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

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

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

以上就速度而言如下。

快速sorting到位。 你需要很less的额外的内存。 这是非常重要的。

中位数的好select使得它更有效率,但即使是中位数担保证券Theta(nlogn)的一个糟糕的select。