为什么快速排序比合并排序更好?
请参阅维基百科上的Quicksort:
通常,快速排序在实践中明显快于其他Θ(nlogn)算法,因为其内循环可以在大多数架构上有效实现,并且在大多数现实世界数据中,可以进行设计选择,从而最小化需要二次方的概率时间.
请注意,非常低的内存要求也是一大优点.
当数据存储在内存中时,快速排序通常比合并排序更快.但是,当数据集很大并且存储在外部设备(如硬盘驱动器)上时,合并排序在速度方面是明显的赢家.它最大限度地减少了外部驱动器的昂贵读取,同时也很适合并行计算.
对于合并排序最坏的情况是O(n*log(n))
,对于快速排序:O(n
2)
.对于其他情况(平均,最好)都有O(n*log(n))
.但是,快速排序是空间常量,其中合并排序取决于您要排序的结构.
看到这个比较.
你也可以直观地看到它.
虽然快速排序通常是比合并排序更好的选择,但合并排序肯定是更好的选择.最明显的时间是,你的算法运行速度比O(n ^ 2)更重要.Quicksort通常比这更快,但是考虑到理论上最差的输入,它可以在O(n ^ 2)中运行,这比最差的可能合并排序更糟糕.
Quicksort也比mergesort更复杂,特别是如果你想编写一个非常可靠的实现,所以如果你的目标是简单性和可维护性,合并排序成为一个很有前途的替代方案,性能损失很小.
我个人想亲自测试快速排序和合并排序之间的区别,并查看1,000,000个元素的样本的运行时间.
快速排序能够在156毫秒内完成,而 Merge排序在247毫秒内完成相同的操作
然而,快速排序数据是随机的,如果数据是随机的,则快速排序表现良好,而不是合并排序的情况,即合并排序在数据排序与否时无关地执行.但是合并排序需要一个完整的额外空间,而快速排序则不是它的就地排序
我已经为他们编写了全面的工作计划,也将为说明图片.
除了其他之外:合并排序对于链接列表等不可变数据结构非常有效,因此是(纯粹)函数式编程语言的不错选择.
实施不当的快速排序可能存在安全风险.
快速排序到位。您只需要在分区功能期间交换数据位置。Mergesort需要更多的数据复制。您需要另一个临时存储(通常与原始数据阵列大小相同)才能用于合并功能。