Recently, a new Quicksort variant due to Yaroslavskiy was chosen as standard sorting method for Oracle's Java 7 runtime library. The decision for the change was based on empirical studies showing that on average, the new algorithm is faster than the formerly used classic Quicksort. Surprisingly, the improvement was achieved by using a dual pivot approach, an idea that was considered not promising by several theoretical studies in the past. In this paper, we identify the reason for this unexpected success. Moreover, we present the first precise average case analysis of the new algorithm showing e.g. that a random permutation of length $n$ is sorted using $1.9n\ln n-2.46n+\mathcal{O}(\ln n)$ key comparisons and $0.6n\ln n+0.08n+\mathcal{O}(\ln n)$ swaps.
Analysis of Pivot Sampling in Dual-Pivot Quicksort
Vladimir Yaroslavskiy的新双枢轴快速排序-从版本7开始在Oracle的Java运行时库中使用-具有有趣的不对称性。他们使这个算法的一个基本变体比经典的单枢轴快速排序使用更少的比较。在本文中,我们将分析的情况下,两个枢轴被选为固定顺序统计量的随机样本。令人惊讶的是,双枢轴快速排序需要比经典快速排序的相应版本更多的比较,所以很明显,计数比较不足以解释在实践中观察到的Yaroslavskiy算法的运行时间优势。因此,我们采取了一个更全面的方法,并给出了准确的前导项的平均交换次数,执行的Java字节码指令的数量和扫描的元素的数量,一个新的简单的成本措施,近似I/O成本的存储层次结构。我们为每个成本度量确定最优顺序统计量。事实证明,Yaroslavskiy算法中的不对称性使具有系统偏斜的枢轴比对称选择更有效。此外,我们终于有一个令人信服的解释,在实践中的成功Yaroslavskiy的算法:与相应版本的经典单枢轴快速排序,双枢轴快速排序需要显着减少的I/O,无论有没有枢轴采样。
Vladimir Yaroslavskiy的新双枢轴快速排序-从版本7开始在Oracle的Java运行时库中使用-在其行为中具有有趣的不对称性。它们被证明会导致该算法的基本变体使用比经典单枢轴快速排序实现更少的比较。在本文中,我们扩展的分析的情况下,两个枢轴被选为固定顺序统计的随机样本,并给出精确的前导项的平均数的比较,交换和执行的Java字节码指令。事实证明,与经典的快速排序不同,选择枢轴作为样本的中位数是最佳的-Yaroslavskiy算法中的不对称性使具有系统偏斜的枢轴比对称选择更有效。此外,最佳偏斜在很大程度上取决于所采用的成本度量;最引人注目的是,像交换和比较的数量这样的抽象成本产生了与计数Java字节码指令非常不同的结果,可以假设它与实际运行时间最密切相关。
排序问题的两个最突出的解决方案是Quicksort和Mergesort。虽然快速排序平均速度非常快,但合并排序还提供了最坏情况的保证,但需要额外的空间来存储线性数量的元素。然而,最坏情况下的有效就地排序仍然是一个挑战:标准解决方案Heapsort存在缓存行为不佳的问题,并且对于缓存内实例来说也不是太快。在这项工作中,我们提出了中位数的中位数QuickMergesort(MoMQuickMergesort),QuickMergesort的一个新的变种,它结合了Quicksort与Mergesort允许后者实施到位。我们的新变体应用中位数的中位数算法选择枢轴,以规避二次最坏的情况。事实上,我们表明,它最多使用$n \log n + 1.6n$比较$n$足够大。我们通过实验证实了理论估计,并表明新算法的性能优于堆排序,并且仅比Introsort(stdlibc++的std::sort实现)慢10%左右,这对最坏情况的保证相当差。我们还模拟了最坏的情况,它只比平均情况慢10%左右。特别是,新算法是一个自然的候选人,以取代堆排序作为一个最坏情况下的塞子在Introsort。