在Java 底层的排序中有几个非常有用并且面试可以装逼的算法,TimSortDualPivotQuicksort( 双轴快速排序 ),( binarySort)二分插入排序。
这三个排序,TimSort的思想非常先进并且有效,是目前排序算法中运用于工程中最最最好的算法了。
在这里我赋上各位大佬写的详细解释的链接:

TimSort详细解释

双轴快排详细解释

这篇文章我们来谈谈Java在底层排序的实现思路(主要是我实现不出来…所以只能谈谈)
在查看底层源码之前,我们先引入双轴快排的基础思想
在数组中选择两个轴,把一个小(pivot1)一个大(pivot2),把数组分为三份,小于pivot1的数 ,大于等于pivot1 并且 小于等于pivot2的数,大于pivot2的数。
如果选出的pivot1 和 pivot2是相等的数,那么中间的区间就是等于pivot1的数了
这就是双轴快排的基本思想。
浅谈Java底层排序双轴快排

底层运用的双轴快排实现思路

浅谈Java底层排序双轴快排
首先我们来看一下参数
浅谈Java底层排序双轴快排
a :待排数组
left :归并的左边界,排序时包括它
right :归并的有边界,排序时包括它
work :给数组分配的辅助空间,如果对这个辅助空间有更高规格的要求,可以自行设置
workBase : 辅助空间工作数组中可用空间的起点
workLen :辅助空间的可用长度
可以看出这里的参数和 TimSort 给出的是同样的参数列表。


进入方法后首先进行判断,待排序区间如果小于了286(QUICKSORT_THRESHOLD),那么就使用原始的快速排序,因为这个数量级太小了,没有必要使用双轴快排。
浅谈Java底层排序双轴快排
如果待排序列的长度大于了286,首先,我们使用了TimSort的一些思想,把序列先遍历一边,把降序或者升序的小序列放进 run 中,
而JDK中的119行到138都是在检测它是否是一个高度结构化的待排序列
在这里如果这些有序的序列块 小于了 67 块,那么就说明它是一个高度结构化的序列了,就适合用TimSort
浅谈Java底层排序双轴快排
而之后如果它不是一个高度结构化的序列,不适合使用 TimSort 那么使用双轴快排
浅谈Java底层排序双轴快排
好了,我们进入这个双轴快排方法看看,我们会发现在这里还进行了一次判断,如果待排数组小于了47,那么就使用双插入排序,双插入排序的实现思想就是一次性找两个数进行插入排序,一个小一个大,先把小的进行插入排序,插入位置之后,大的在从小的插入的位置开始向后搜索进行插入排序,这样效率就会高出很多了
浅谈Java底层排序双轴快排
如果待排数组大于了47,那么就使用双轴快排。
那么大家相信也很清楚,如何选择轴也就是选择基准,这将决定快速排序的效率。JDK底层找到这两个轴的算法非常复杂,我们利用图来解释
浅谈Java底层排序双轴快排
浅谈Java底层排序双轴快排浅谈Java底层排序双轴快排

详细流程图
浅谈Java底层排序双轴快排
浅谈Java底层排序双轴快排

相关文章:

  • 2021-11-24
  • 2022-12-23
  • 2022-01-14
  • 2021-12-17
  • 2021-08-24
猜你喜欢
  • 2022-01-20
  • 2021-11-16
  • 2021-12-09
  • 2021-06-10
  • 2022-01-09
  • 2021-07-21
  • 2021-12-19
相关资源
相似解决方案