为什么快速排序可能比归并排序更好?
为什么快速排序可能比归并排序更好?
请参考维基百科上有关 快速排序 的内容:
通常情况下,与其他Θ(nlogn)算法相比,快速排序实际上的运行速度要快得多,因为它的内部循环可以在大多数架构中得到有效的实现,在大多数实际的数据中,我们可以进行设计选择,从而最小化需要二次时间的概率。
需要注意的是,非常低的内存需求也是一个重要的优点。
快速排序通常比归并排序更快,当数据存储在内存中时。然而,当数据集非常庞大且存储在外部设备(如硬盘)上时,归并排序在速度方面是明显的赢家。它最小化了对外部驱动器的昂贵读取,并且也非常适合并行计算。
虽然快速排序通常比归并排序更好,但在某些情况下,理论上归并排序可能是更好的选择。最明显的情况是当算法比O(n^2)更快非常重要时。快速排序通常比这个更快,但是在理论上最坏的情况下,它可能以O(n^2)的时间运行,这比最坏的归并排序更糟。
相比之下,快速排序比归并排序更复杂,尤其是如果您想编写一个真正稳健的实现,因此,如果您的目标是简单性和可维护性,则归并排序成为一个很有前途的替代方案,并且几乎没有性能损失。
我个人想测试快速排序和归并排序之间的差异,并查看1,000,000个元素样本的运行时间。
然而,快速排序数据是随机的,如果数据是随机的,则快速排序表现良好,而归并排序不是这种情况,即无论数据是否排序,归并排序都执行相同。但是,归并排序需要一个额外的完整空间,而快速排序不需要,因为它是原地排序。
我为它们编写了详细的工作程序,并附有说明图片。
快速排序是原地排序算法。在划分函数期间,您只需要交换数据的位置即可。 归并排序需要更多的数据复制。您需要另一个临时存储(通常与原始数据数组大小相同)用于合并函数。
在基本值的DualPivotQuickSort引入的更改方面,答案会稍微倾向于快速排序。它在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.
快速排序更好并不是真的。另外,这取决于你所说的更好是什么,内存消耗还是速度。
就内存消耗而言,在最坏情况下,快速排序可以使用n^2的内存(即每个分区为1到n-1),而归并排序使用nlogn的内存。
在速度方面,上述内容也适用。