java中Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。

快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的

归并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。补充一点合并排序的时间复杂度是nlogn, 快速排序的平均时间复杂度也是nlogn,但是合并排序的需要额外的n个引用的空间。

源码中的快速排序,主要做了以下几个方面的优化:

1)当待排序的数组中的元素个数较少时,源码中的阀值为7,采用的是插入排序。尽管插入排序的时间复杂度为0(n^2),但是当数组元素较少时,插入排序优于快速排序,因为这时快速排序的递归操作影响性能。

2)较好的选择了划分元(基准元素)。能够将数组分成大致两个相等的部分,避免出现最坏的情况。例如当数组有序的的情况下,选择第一个元素作为划分元,将使得算法的时间复杂度达到O(n^2).

3)根据划分元 v ,形成不变式 v* (

源码中选择划分元的方法:

1)当数组大小为 size=7 时 ,取数组中间元素作为划分元。int n=m>>1;(此方法值得借鉴)。

2)当数组大小size大于7小于等于40时,取首、中、末三个元素中间大小的元素作为划分元。

3)当数组大小 size>40 时 ,从待排数组中较均匀的选择9个元素,选出一个伪中数做为划分元。

普通的快速排序算法,经过一次划分后,将划分元排到素组较中间的位置,左边的元素小于划分元,右边的元素大于划分元,而没有将与划分元相等的元素放在其附近,这一点,在Arrays.sort()中得到了较大的优化。

举例:15、93、15、41、6、15、22、7、15、20

举例:15、93、15、41、6、15、22、7、15、20

因size大于7小于等于40 ,所以在15、6、和20 中选择v = 15 作为划分元。

经过一次换分后: 15、15、7、6、41、20、22、93、15、15. 与划分元相等的元素都移到了素组的两边。

接下来将与划分元相等的元素移到数组中间来,形成:7、6、15、15、15、15、41、20、22、93.

最后递归对两个区间进行排序[7、6]和[41、20、22、93].,所以在15、6、和20 中选择v = 15 作为划分元。

java arrays.sort原理_Arrays.sort()原理相关推荐

  1. java arrays.sort() c_正面刚算法-Java中Arrays.sort()(一)

    最近一直在看关于排序相关的算法,从O(n²)的冒泡.插入.选择到O(nlog(n))的归并.快排.再到桶排序.计数排序.基数排序.各个算法都有自己的优点和缺点,那么jdk中关于这种底层的算法是怎么实现 ...

  2. Java Arrays.sort()的几种用法

    Java的Arrays类中有一个sort()方法,该方法是Arrays类的静态方法,在需要对数组进行排序时,非常的好用. 但是sort()的参数有好几种,下面我就为大家一一介绍,这几种形式的用法. = ...

  3. python sorted原理_Python sort()和sorted()

    Python sort()和sorted() sort 与 sorted 区别: sort() sort()是列表list的方法之一 L.sort(key=None, reverse=False) s ...

  4. 五、redis原理之sort set底层数据结构

    一.redis原理之sort set底层数据结构? SortedSet(zset)有序集合可以看做是在Set集合的的基础上为集合中的每个元素维护了一个顺序值: score,它允许集合中的元素可以按照s ...

  5. sort排序方法的实现原理

    sort 排序方法的实现原理   我们比较常用的是直接调用 JS的 sort方法,围绕原生 JS方法,并结合 V8排序的代码一起来分析,以便碰到类似的 JS排序问题时能够轻松应对.   在开始前请思考 ...

  6. java数组原理_Java数组排序原理

    Arrays排序原理 Java Arrays排序原理 计数排序源码 (short为例) ​ for (int i = left - 1; ++i <= right;count[a[i] - Sh ...

  7. java.util.ComparableTimSort中的sort()方法简单分析

    TimSort算法是一种起源于归并排序和插入排序的混合排序算法,设计初衷是为了在真实世界中的各种数据中能够有较好的性能. 该算法最初是由Tim Peters于2002年在Python语言中提出的. T ...

  8. Java异常:IllegalArgumentException Collections.sort报错

    异常 java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util ...

  9. java 数组升序排序_Java sort()数组排序升序详解

    下面的文章要给大家讲到的就是Java sort()数组排序方面的知识,主要会给大家讲到升序,下面的话就一起来进行一下了解吧. 使用java.util.Arrays类当中的sort()方法对数组进行升序 ...

最新文章

  1. “巨杉数据库”获1000万美元B轮融资,DCM领投
  2. 初始化全局变量实例说明C语言中初始化和未初始化的全局变量所在不同的段
  3. 使用JDBC操作基于Oracle的CLOB,BLOB字段类型
  4. 多重继承之虚继承(主要是为了解决产生的数据冗余问题)
  5. Unity脚本运行时更新带来了什么?
  6. java判断是否能上网_用Java检测远程主机是否能被连接
  7. linux vim编辑矩阵乘,VIM使用系列:二进制文件编辑
  8. mysql基础命令集合
  9. 【Python爬虫历程】使用Cookie来模拟登陆
  10. CSS代码写一个网页,有留言板
  11. NDEF格式的smart tag在Mifare UltraLight卡中的存储方式
  12. QGIS二次开发:鼠标在地图上移动时,状态栏显示鼠标所在位置经纬度
  13. acme.sh申请Let‘s encrypt泛域名证书Docker化部署
  14. VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)
  15. 交换机口不够用能再加一个吗_PoE交换机常见6大问题,一文掌握
  16. 小论文格式要求(2010年版)
  17. 多系统引导启动盘“完美解决”方案——Ventoy工具
  18. 特殊字符url编码以后再解码后出现错误(not , cent, curren, pound)
  19. 面向服务的体系架构(SOA)—入门篇
  20. redhat 7.6 配置yum源

热门文章

  1. 用800行代码做个行为树(Behavior Tree)的库(3)
  2. 宝妈怎么找副业?如何寻找副业兼职?
  3. 南邮《算法分析与设计》期末复习CH7:动态规划
  4. uva 11600 - Masud Rana(记忆化搜索)
  5. Nodejs——setInterval设置停止的次数和时间
  6. 图片扭扭看,牛逼的图像学算法【安卓软件】
  7. 论文导读 | 使用路径索引加速正则路径查询的执行
  8. Java 编写推箱子报告,推箱子游戏用java怎么去写
  9. CSS 盒子模型及 float 和 position
  10. IPSec over GRE 和 GRE over IPSec学习总结