双枢轴快速排序的平均情况与分布分析
数据结构与算法
2015-02-16 v3 概率论
摘要
2009 年,Oracle 在其 Java 7 运行时库中用 Vladimir Yaroslavskiy 开发的一种新型双枢轴快速排序(dual-pivot Quicksort)变体替换了长期使用的排序算法。该决定基于 Yaroslavskiy 的实现方案在运行时间实验中表现出的卓越性能。当时,尚无精确的理论研究能解释其优越性能;相反,此前对其他双枢轴快速排序变体的理论研究甚至不推荐使用双枢轴。直到 2012 年,本文作者中的两人对 Yaroslavskiy 算法的简化版本进行了平均情况分析,证明了其在比较次数上可能节省开销。然而,Yaroslavskiy 的算法需要更多的交换操作,这使得分析结论尚不明确。为了彻底解决这一问题,我们将分析扩展至 Knuth 式的完全详细风格:我们确定了执行的 Java 字节码指令的确切数量。令人惊讶的是,Yaroslavskiy 的算法所需的字节码指令略多于经典快速排序的简单实现,这与观察到的运行时间相矛盾。如同 Oracle 库的实现一样,我们引入了对小规模子问题使用插入排序(Insertionsort),并表明这确实从字节码角度加速了 Yaroslavskiy 的快速排序;但即使采用最优的插入排序阈值,这种新的快速排序变体在平均情况下仍需略多的字节码指令。最后,我们证明 Yaroslavskiy 算法的(适当归一化)代价收敛于一个随机变量,其分布由一个不动点方程刻画。据此,我们计算了代价的方差,并表明对于大 n,代价集中在其均值附近。
引用
@article{arxiv.1304.0988,
title = {Average Case and Distributional Analysis of Dual-Pivot Quicksort},
author = {Sebastian Wild and Markus E. Nebel and Ralph Neininger},
journal= {arXiv preprint arXiv:1304.0988},
year = {2015}
}
备注
v3 is content-wise identical to TALG version