双枢轴快速排序:Java 针对原始数据类型的默认排序算法。

2025-06-07

双枢轴快速排序:Java 针对原始数据类型的默认排序算法。

当我们在 Java 中执行 Arrays.sort() 时会发生什么?Java 在后台使用哪种排序算法?

自 2011 年 Java 7 发布以来,使用的默认排序算法是 DualPivotQuickSort,它是对经典快速排序算法的增强。

双枢轴快速排序是插入排序和快速排序的结合。当待排序元素数量较少时,插入排序的运行速度更快。双枢轴快速排序利用了这一特性,因此当元素数量小于等于 47 时,Java 会在底层执行插入排序。

当输入数组大小大于 47 时,Java 会使用双主元快速排序。顾名思义,双主元快速排序算法选取 2 个主元而不是 1 个。与快速排序中围绕 1 个主元对数组进行划分不同,我们围绕 2 个主元将数组划分为三部分。

第一个子数组:items < LP
第二个子数组:LP <= items <= RP
第三个子数组 =:items >= RP

算法

LP:左枢轴
RP:右枢轴

1.) 数组中最左边的项作为左主元,最右边的项作为右主元。2
.) 如果 LP > RP,则将左主元与右主元交换
3.) 围绕左主元和右主元将数组分成三个子数组。

一旦完成分区,我们将对三个子数组递归执行上述 3 个步骤。

让我们来看一个例子:

图像的替代文本

由于 LP < RP,上图中无需交换主元。
现在,我们按照以下方案对数组进行分区。

第一个子数组:items < LP
第二个子数组:LP <= items <= RP
第三个子数组 =:items >= RP

图像的替代文本

现在我们有了 3 个子数组,我们将对它们执行与上述相同的步骤。由于前两个数组只有 2 个元素,因此一个将成为左主元,另一个将成为右主元。如果左主元大于右主元,我们将交换左主元和右主元,但前两个子数组的情况并非如此。

图像的替代文本

对于第三个子数组,正如我们在下图中看到的,左主元大于右主元,因此我们将交换它们。

图像的替代文本

交换枢轴。
图像的替代文本

数组中没有可以进一步划分的元素。
图像的替代文本

图像的替代文本

参考

https://www.geeksforgeeks.org/dual-pivot-quicksort/
https://stackoverflow.com/questions/20917617/whats-the-difference-of-dual-pivot-quick-sort-and-quick-sort
http://codeblab.com/wp-content/uploads/2009/09/DualPivotQuicksort.pdf

结论:
同样,Python 使用了 Timsort,它是插入排序和归并排序的结合。接下来的几天里,我想阅读和撰写一些关于快速排序的其他变体的文章。


如果您希望我撰写特定主题的文章,请随时在下面的评论部分发表。

您可以通过在下面给我买一杯咖啡来支持我的工作。💚💚💚💚💚💚!!
给我买一杯咖啡

文章来源:https://dev.to/s_awdesh/double-pivot-quick-sort--javas-default-sorting-algorithm-1m4
PREV
关注结果,而不是在办公室花费的时间
NEXT
开始用 CSS 艺术创作——一步步教你画一只绵羊!