New simple and fast quicksort algorithm for equal keys
本文提出eqsort,一种面向含重复键数据的高效快速排序分区方法,实验表明其性能可与dual-pivot quicksort等当前最佳实现竞争,并有望成为替代方案。
2025-03-11 cs.DS
Pivot Sampling in Dual-Pivot Quicksort
Vladimir Yaroslavskiy的新双枢轴快速排序-从版本7开始在Oracle的Java运行时库中使用-在其行为中具有有趣的不对称性。它们被证明会导致该算法的基本变体使用比经典单枢轴快速排序实现更少的比较。在本文中,我们扩展的分析的情况下,两个枢轴被选为固定顺序统计的随机样本,并给出精确的前导项的平均数的比较,交换和执行的Java字节码指令。事实证明,与经典的快速排序不同,选择枢轴作为样本的中位数是最佳的-Yaroslavskiy算法中的不对称性使具有系统偏斜的枢轴比对称选择更有效。此外,最佳偏斜在很大程度上取决于所采用的成本度量;最引人注目的是,像交换和比较的数量这样的抽象成本产生了与计数Java字节码指令非常不同的结果,可以假设它与实际运行时间最密切相关。
2014-06-13 cs.DS math.PR
Counting Zeros in Random Walks on the Integers and Analysis of Optimal Dual-Pivot Quicksort
我们提出了一个平均的情况下分析的两个变种的双枢轴快速排序,一个非算法的比较最优分割策略,其他密切相关的算法策略。对于这两个,我们计算的预期数量的比较,以及渐近,特别是,我们提供了精确的表达式的线性,对数,和常数项。一个重要的步骤是在一定的概率模型中分析格路的零点。一路上证明了一个组合身份。
2016-05-11 cs.DS math.CO
Dual-Pivot Quicksort: Optimality, Analysis and Zeros of Associated Lattice Paths
我们提出了一个平均的情况下分析的一个变种的双枢轴快速排序。我们表明,所使用的算法划分策略是最佳的,即,它使关键比较的预期数量最小化。对于分析,我们计算的预期数量的比较,以及渐近,特别是,我们提供了精确的表达式的线性,对数,和常数项。一个重要的步骤是在一定的概率模型中分析格路的零点。一路上证明了一个组合身份。
2017-11-27 cs.DS math.CO
Partitioning schemes for quicksort and quickselect
我们介绍了几个修改的分区计划中使用的霍尔的快速排序和快速选择算法,包括三元方案,确定键小于或大于枢轴。我们估计每个计划的互换数量。我们的计算实验表明,三进制方案允许快速选择,以确定所有的键等于选定的键在很少的额外成本。
2003-12-23 cs.DS
Average Case and Distributional Analysis of Dual-Pivot Quicksort
在2009年,Oracle在其Java 7运行时库中替换了长期服务的排序算法,由Vladimir Yaroslavskiy提供了一个新的双枢轴Quicksort变体。这个决定是基于Yaroslavskiy的实现在运行时实验中惊人的良好性能。在那个时候,还没有对该算法的精确研究来解释其优越的性能-相反:以前对其他双枢轴快速排序变体的理论研究甚至不鼓励使用两个枢轴。仅在2012年,两位作者对雅罗斯拉夫斯基算法的简化版本进行了平均案例分析,证明节省比较次数是可能的。然而,Yaroslavskiy的算法需要更多的交换,这使得分析不确定。为了解决这个问题,我们在这里将我们的分析扩展到Knuth的完全详细的风格:我们确定执行的Java字节码指令的确切数量。令人惊讶的是,Yaroslavskiy的算法需要比经典快速排序的简单实现稍微多一点的字节码指令-与观察到的运行时间相矛盾。就像在Oracle的库实现中一样,我们在小的子问题上使用Insertionsort,并表明它确实在字节码方面加快了Yaroslavskiy的Quicksort;但即使有最佳Insertionsort阈值,新的Quicksort变体平均需要稍微多一点的字节码指令。最后,我们表明,(适当规范化)的成本Yaroslavskiy的算法收敛到一个随机变量,其分布特征在于由一个不动点方程。由此,我们计算了成本的方差,并表明对于大n,成…
2015-02-13 cs.DS math.PR
Average Case Analysis of Java 7's Dual Pivot Quicksort
最近,Yaroslavskiy的一个新的Quicksort变体被选为Oracle Java 7运行时库的标准排序方法。这一变化的决定是基于经验研究,这些研究表明,平均而言,新算法比以前使用的经典快速排序更快。令人惊讶的是,这种改进是通过使用双枢轴方法实现的,这种方法在过去的几项理论研究中被认为是没有前途的。在本文中,我们确定了这一意外成功的原因。此外,我们提出了第一个精确的平均情况下分析的新算法显示,例如,随机排列的长度$n$排序使用$1.9n\ln n-2.46n+\mathcal{O}(\ln n)$密钥比较和$0.6n\ln n+0.08n+\mathcal{O}(\ln n)$交换。
2013-10-28 cs.DS math.PR
Analysis of Branch Misses in Quicksort
算法的分析主要依赖于计算经典的基本运算,如加法,乘法,比较,交换等,这种方法通常足以量化算法的效率。然而,在某些情况下,现代处理器架构的特性(如流水线执行和存储层次结构)对运行时间有显著影响,需要考虑到这些特性才能得到可靠的结果。一个例子是Quicksort:实验证明,在硬件上的某些条件下,将枢轴作为样本的中值的经典最优平衡选择变得有害。原因在于错误预测的分支,其回滚成本成为主导。在本文中,我们给出了第一个精确的分析调查的影响,流水线和由此产生的分支预测失误的效率(经典)快速排序和雅罗斯拉夫斯基的双支点快速排序在Oracle的Java 7库中实现。对于后者,人们仍然没有完全理解为什么实验证明它比经典单枢轴版本的高度工程化实现快10%。对于不同的分支预测策略,我们给出了精确的渐近的预期数量的分支失误所造成的上述快速排序变种时,他们的枢轴是从输入的样本中选择。我们的结论是,分支未命中的差异太小,无法解释双枢轴算法的优越性。
2014-11-07 cs.DS math.PR
On Smoothed Analysis of Quicksort and Hoare's Find
我们提供了一个平滑的霍尔的发现算法的分析,我们重新审视快速排序的平滑分析。霍尔的查找算法-通常称为快速选择-是一个易于实现的算法,用于查找序列的第k个最小元素。虽然霍尔的发现所需的最坏情况下的比较次数是二次的,但平均情况下的比较次数是线性的。我们分析这两个极端之间发生了什么,提供了一个平滑的分析算法在两个不同的扰动模型:加性噪声和部分排列。此外,我们提供了快速排序和霍尔的发现的三个枢轴规则的中位数,这通常会产生更快的算法比总是选择第一个元素的比较平滑的数量的下限:枢轴是中位数的第一个,中间,和序列的最后一个元素。我们表明,中位数的三个不产生显着的改善,经典的规则:下限的经典规则结转到中位数的三个。
2009-04-25 cs.DS
Using Non-Linear Difference Equations to Study Quicksort Algorithms
本文利用非线性差分方程,结合符号计算,详细研究了著名的快速排序算法的各种变体的运行时间,将单枢轴和多枢轴快速排序算法的变体看作离散概率问题。利用非线性差分方程、递推关系和实验数学技巧,可以得到比较数和交换数的期望、方差和高阶矩的显式表达式。对某些变量进行了蒙特卡罗实验,给出了数值结果,并讨论了标度极限分布。
2020-02-26 cs.DS math.CO
A note on multipivot Quicksort
我们分析了概括的快速排序算法,其中k均匀随机选择的枢轴用于分区的n个不同的键的数组。具体地说,该计划的预期成本,得到的假设下,所需的分区过程的成本的线性。使用范德蒙矩阵计算期望成本的积分常数。
2018-09-04 cs.DS math.CO
QuickMergesort: Practically Efficient Constant-Factor Optimal Sorting
我们认为内部排序的$n$元素序列的基本问题。在其最佳理论设置QuickMergesort中,QuickSort与Mergesort的组合以及$\sqrt{n}$的中位数枢轴选择,平均最多需要$n \log n - 1.3999n + o(n)$元素比较。本文解决的问题是如何使该算法实用。由于精细的枢轴选择通常会增加很多开销,我们发现QuickMergesort的中位数3枢轴选择导致平均最多$n \log n - 0{.}75n + o(n)$元素比较,同时在基本数据上运行速度很快。实验表明,QuickMergesort优于最先进的库实现,包括C++的Introsort和Java的Dual-Pivot Quicksort。进一步权衡低运行时间和低数量的比较进行了研究。此外,我们描述了一个实际有效的版本与$n \log n + O(n)$比较在最坏的情况下。
2018-04-26 cs.DS
Triple State QuickSort, A replacement for the C/C++ library qsort
提出了一种工业级快速排序函数及其新算法。与其他4个著名的快速排序实现相比,新算法在大多数情况下减少了比较和交换的数量,同时在最坏的情况下保持接近4个中最好的。我们用空间换取性能,在最坏的情况下,代价是n/2个临时的额外空间。运行时间测试显示,与其他4个函数的整体最佳值相比,整体性能至少提高了15.8%。此外,与Yaroslavskiy的新Dual Pivot Quicksort相比,我们的函数的运行时间提高了32.7%。我们的函数是基于指针的,这意味着可以替代C/C++库qsort()。但我们也提供了一个数组为基础的功能相同的算法,方便移植到不同的程序设计语言。
2015-05-11 cs.DS cs.PF
Analysis of Quickselect under Yaroslavskiy's Dual-Pivoting Algorithm
算法界对Yaroslavskiy引入的新分区方法感到兴奋。这种算法使快速排序比在经典分区方法下运行的情况稍快。我们表明,这种改进的性能在Quicksort是不持续的Quickselect,一个变体的Quicksort的顺序统计。我们调查的数量比较快速选择找到一个关键的随机选择的排名下雅罗斯拉夫斯基的算法。这种总平均是特定固定顺序统计量的所有个体分布上的平滑算子。我们给出精确的总平均值。大分布的数量比较(当适当缩放)是作为一个分配方程的收缩在Zolotarev度量空间的不动点解。我们的调查表明,Quickselect下旧的分区方法略优于Quickselect下Yaroslavskiy的算法,随机排名的顺序统计。对于极值顺序统计量也得到了类似的结果,我们再次找到了精确的平均值和比较次数的分布(当适当缩放时)。这两个极限分布都是永久分布(独立混合连续随机变量的乘积之和)。
2014-11-15 cs.DS math.PR
Sesquickselect: One and a half pivots for cache-efficient selection
由于CPU性能的空前提高,内存传输已成为程序执行的瓶颈。正如近年来发现的那样,这也会影响内部记忆的排序。由于围绕几个枢轴分区减少了整体内存传输,我们已经看到了对多路快速排序的新兴趣。在这里,我们分析了多路分区在Quickselect中的帮助。我们计算的预期数量的比较和扫描的元素(近似内存传输)的一个通用类(非自适应)多路快速选择,并表明,三个或更多的枢轴是没有帮助的,但两个枢轴。此外,我们认为“自适应”的变种,选择分区和选择方法,在每个递归步骤从一个有限的替代品取决于当前(相对)寻求排名。我们表明,“Sesquickselect”,一个新的快速选择的变种,使用一个或两个支点,更好地利用小样本w.r.t.内存传输比其他Quickselect变体。
2018-10-29 cs.DS
New Sorting Algorithm Wave Sort (W-Sort)
University of California, Davis(加州大学戴维斯分校)
波排序是一种新型原地排序算法,通过动态主元选择策略解决传统排序算法的性能问题,具有高效的比较复杂度和稳定的性能表现。
2026-01-04 cs.DS
The Quicksort algorithm and related topics
由于排序算法在数学、计算机科学及相关领域有着广泛的应用,因此它引起了人们的广泛关注和研究。在这篇论文中,我们首先处理快速排序算法及其变体的数学分析。具体来说,我们研究的算法的时间复杂度,我们提供了一个完整的演示的方差所需的比较,一个已知的结果,但其详细的证明是不容易读出来的文献。我们还研究了快速排序的变体,其中选择多个枢轴来划分数组。本文的其余部分致力于分析当预先给出与真序相容的偏序时,通过进一步的成对比较来找到真序。我们讨论了一些情况下,偏序集随机出现。为此,我们采用图和信息论的结果。最后,当偏序集来自随机图时,我们得到了线性扩张数量的另一个界,并讨论了Shellsort在合并链中的可能应用。
2015-10-02 cs.DS math.CO
Worst-Case Efficient Sorting with QuickMergesort
排序问题的两个最突出的解决方案是Quicksort和Mergesort。虽然快速排序平均速度非常快,但合并排序还提供了最坏情况的保证,但需要额外的空间来存储线性数量的元素。然而,最坏情况下的有效就地排序仍然是一个挑战:标准解决方案Heapsort存在缓存行为不佳的问题,并且对于缓存内实例来说也不是太快。在这项工作中,我们提出了中位数的中位数QuickMergesort(MoMQuickMergesort),QuickMergesort的一个新的变种,它结合了Quicksort与Mergesort允许后者实施到位。我们的新变体应用中位数的中位数算法选择枢轴,以规避二次最坏的情况。事实上,我们表明,它最多使用$n \log n + 1.6n$比较$n$足够大。我们通过实验证实了理论估计,并表明新算法的性能优于堆排序,并且仅比Introsort(stdlibc++的std::sort实现)慢10%左右,这对最坏情况的保证相当差。我们还模拟了最坏的情况,它只比平均情况慢10%左右。特别是,新算法是一个自然的候选人,以取代堆排序作为一个最坏情况下的塞子在Introsort。
2018-11-02 cs.DS
Simple and Fast BlockQuicksort using Lomuto's Partitioning Scheme
本文介绍了Edelkamp和Weiss(ESA 2016)描述的BlockQuicksort算法的简单变体。简化是通过使用Lomuto的分区方案,而不是Hoare的交叉指针技术来划分输入。为了实现一个强大的排序算法,以及在许多不同的输入类型,本文介绍了一种新的两个枢轴Lomuto的分区方案的变体。一个令人惊讶的简单扭曲的通用两个枢轴快速排序方法使算法强大。本文提供了一个分析所提出的算法的理论特性,并将它们与竞争对手进行比较。分析表明,基于Lomuto的方法比基于Hoare的BlockQuicksort方法产生更高的平均排序成本。此外,分析是特别有用的理由约枢纽选择,适合双枢纽的方法。一项广泛的实验研究表明,尽管它们的理论行为较差,但更简单的变体的性能与原始版本的BlockQuicksort一样好。
2018-10-29 cs.DS
QuickXsort - A Fast Sorting Scheme in Theory and Practice
QuickXsort是一种高效的就地顺序排序方案,它将Hoare的Quicksort算法与X混合在一起,其中X可以从更广泛的其他已知排序算法中选择,如Heapsort,Insertionsort和Mergesort。它的主要优点是QuickXsort可以在X没有的情况下就位。在这项工作中,我们提供了一般的转移定理表示的比较的QuickXsort的X的数量的比较。更具体地说,如果选择枢轴作为(不太快)增长大小样本的中位数,则QuickXsort和X的平均比较次数仅相差$o(n)$项。对于某些常数$k$的$k$的中值主元选择,差是一个线性项,我们精确计算其系数。例如,三个QuickMergesort的中位数最多使用$n \lg n - 0.8358n + O(\log n)$比较。此外,我们还研究了使用更少比较的其他算法对基本情况进行排序的可能性。通过这样做,比较的平均情况数量可以减少到$n \lg n- 1.4106n + o(n)$,剩余的间隙仅为$0.0321n$与已知下限的比较(同时总体上仅使用$O(\log n)$额外空间和$O(n \log n)$时间)。这些排序策略的实现表明,这些算法挑战了成熟的库实现,如Musser的Introsort。
2018-11-03 cs.DS
An Extended Note on the Comparison-optimal Dual Pivot Quickselect
在本说明中,确定了任何双枢轴快速选择算法(无采样)平均所需的精确最小键比较次数。其结果以比较最优算法的精确公式和渐近公式的形式给出。事实证明,这些渐近展开的主要条款与经典快速选择的相应分析的主要条款相一致,但仍然--正如雅罗斯拉夫斯基快速选择所示--在双枢轴变体中需要更多的比较。结果是通过求解二阶微分方程的生成函数从递归方法获得的。
2016-10-16 cs.DS math.CO
Huskysort
关于排序问题的大量文献都集中在最小化比较和/或交换/副本的数量上。然而,衡量排序算法性能的一个更合适的标准是基于所需的数组访问的总数(“工作”)。对于一个基于分而治之的排序(包括该主题的迭代变体),我们可以将工作分为线性的(即$\textbf{O}(N)$)工作和线性的(即$\textbf{O}(N log N)$)工作。将工作从线性阶段移动到线性阶段的算法可能能够减少阵列访问的总数,并且间接地减少处理时间。本文介绍了一种排序方法,它通过替代廉价的比较,尽可能地减少了昂贵的比较在线性阶段的数量。在Java中,两种系统排序是双枢轴快速排序(用于原语)和对象的Timsort。我们证明,这两种算法的组合可以运行速度显着比单独的算法的类型的对象是昂贵的比较。我们称之为改进的排序算法Huskysort。
2020-12-01 cs.DS
TwinArray Sort: An Ultrarapid Conditional Non-Comparison Based Sorting Algorithm
本文提出TwinArray Sort,一种利用双辅助数组和条件去重验证的非比较排序算法,达到O(n+k)复杂度,在多种数据分布下优于传统排序算法,适用于大规模数据处理和机器学习数据集管理。
2024-09-30 cs.CC cs.DS