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

TimSort详细解释

双轴快排详细解释

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

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


首先我们来看一下参数

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


进入方法后首先进行判断,待排序区间如果小于了286(QUICKSORT_THRESHOLD),那么就使用原始的快速排序,因为这个数量级太小了,没有必要使用双轴快排。

如果待排序列的长度大于了286,首先,我们使用了TimSort的一些思想,把序列先遍历一边,把降序或者升序的小序列放进 run 中,
而JDK中的119行到138都是在检测它是否是一个高度结构化的待排序列
在这里如果这些有序的序列块 小于了 67 块,那么就说明它是一个高度结构化的序列了,就适合用TimSort

而之后如果它不是一个高度结构化的序列,不适合使用 TimSort 那么使用双轴快排

好了,我们进入这个双轴快排方法看看,我们会发现在这里还进行了一次判断,如果待排数组小于了47,那么就使用双插入排序,双插入排序的实现思想就是一次性找两个数进行插入排序,一个小一个大,先把小的进行插入排序,插入位置之后,大的在从小的插入的位置开始向后搜索进行插入排序,这样效率就会高出很多了

如果待排数组大于了47,那么就使用双轴快排。
那么大家相信也很清楚,如何选择轴也就是选择基准,这将决定快速排序的效率。JDK底层找到这两个轴的算法非常复杂,我们利用图来解释

详细流程图

浅谈Java底层排序双轴快排相关推荐

  1. Java 细节汇总(4)-Arrays 中的双轴快排

    文章目录 1. Arrays 中的双轴快排 2. Java 中 switch 支持字符串的原理 3. Java 中 break,continue 标签的用法 4. Java 中 Math.ceil() ...

  2. 【排序算法】——图解双轴快排(建议收藏)

    原创公众号:「bigsai」,转载需注明出处 关注回复bigsai领取Java进阶pdf,回复进群加入力扣打卡群(目前200+). 觉得不错还请一键三连! 前言 在排序算法中,快排是占比非常多的一环, ...

  3. 单轴快排(SinglePivotQuickSort)和双轴快排(DualPivotQuickSort)及其JAVA实现

    快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决.通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快 ...

  4. java 中的排序_浅谈java中常见的排序

    浅谈java中常见的排序 学过java的人都知道,排序这一部分初次接触感觉还是有点难以理解,很多地方也会用到.然而,在java中常见的排序方法:冒泡排序,选择排序,插入排序等等.下面就让我们一起揭开他 ...

  5. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  6. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  7. java bitset用途_浅谈Java BitSet使用场景和代码示例

    搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...

  8. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  9. 【python】数据结构和算法 + 浅谈单链表与双链表的区别

    有这么一句话说"程序=数据结构+算法",也有人说"如果把编程比作做菜,那么数据结构就好比食材(菜),算法就好比厨艺(做菜的技巧)". 当然这是笼统的说法,不过也 ...

最新文章

  1. jfinal框架下使用c3P0连接池连接sql server 2008
  2. 【转】研发游戏引擎那么难,为什么还应该砸钱去干?
  3. java map byte[],java中byte数组不能作为map的key使用
  4. 前端学习(612):js的三种书写位置
  5. Java容器 | 基于源码分析List集合体系
  6. mysql 一行取最大值_mysql 分组取最大值的同时获取包含最大值的行的其他字段
  7. 50-000-040-配置-MAC 安装MySQL my.cnf配置文件
  8. 【零基础学Java】—初识Java(一)
  9. 肚子上挂张画就能隐身:AI完全看不出我在哪,更看不出我是人类了 | 开源
  10. Scikit-Learn库概述
  11. Activity 的启动模式
  12. 微软Windows Hello曝漏洞!外接一个USB摄像头,分分钟破解你的电脑
  13. Chaos 发布流体模拟王者 Phoenix 的5.0版本!
  14. java如何接收键盘输入_java接收键盘输入(三种方法)
  15. html小总结:表格立体效果的实现.
  16. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效
  17. 关于语音会议自动转文字系统的想法
  18. EAS报表开发----收付明细
  19. 生态梯田 “薯”光无限
  20. 【OV7670】基于FPGA的OV7670摄像头介绍和使用

热门文章

  1. if or函数套用_IF函数还可以这样用!IF(AND)(OR)混合多条件判断
  2. vue判断是否登录,若未登录跳转登录页
  3. r9 6900hx参数 r9 6900hx功耗
  4. 多线程实现的四种方式
  5. Linux 红帽9.0 本地源 与 网络源 搭建
  6. 解决Oracle创建视图,权限不足的问题
  7. PS - 如何将每一个图层保存成一张PNG
  8. matlab 插和曲面
  9. 前端 -> jQuery 遍历
  10. node各个版本的下载地址