Arrays.sort(int[])

Arrays.sort(int[])使用的是quicksort+merge sort。

  • 使用quicksort:当数组长度比较小(right-left<286),或者数组有序的程度不是很高(有序子数组个数>=67个),或者有较多的相等元素(连续33个元素相等)使用quicksort。
  • 使用mergesort:当数组长度较长且有序程度较高时,使用。

总结来说,当数组中连续相等的数>=MAX_RUN_LENGTH(33)个时,执行quickSort;当for循环执行次数>=67时,说明数组中的连续子串数目较多(换句话说,在数组长度固定下,每个连续子串的长度较短),有序程度低,执行queckSort。否则,执行mergeSort,

static void sort(int[] a, int left, int right,int[] work, int workBase, int workLen) {// Use Quicksort on small arrays,QUICKSORT_THRESHOLD=286if (right - left < QUICKSORT_THRESHOLD) {sort(a, left, right, true);return;}/** Index run[i] is the start of i-th run* (ascending or descending sequence).*/int[] run = new int[MAX_RUN_COUNT + 1];int count = 0; run[0] = left;// Check if the array is nearly sortedfor (int k = left; k < right; run[count] = k) {if (a[k] < a[k + 1]) { // ascending,跳过升序子序列while (++k <= right && a[k - 1] <= a[k]);} else if (a[k] > a[k + 1]) { // descending,跳过降序子序列while (++k <= right && a[k - 1] >= a[k]);// 将降序子序列变成升序,交换左右两边的值for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {int t = a[lo]; a[lo] = a[hi]; a[hi] = t;}} else { // equal,当有MAX_RUN_LENGTH=33个值连续相等时,使用quicksortfor (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {if (--m == 0) {sort(a, left, right, true);return;}}}/** The array is not highly structured,* use Quicksort instead of merge sort.*/// 当count==MAX_RUN_COUNT(67)时,说明已经遍历了67个连续的子序列,这说明数组有序程度不高,使用quicksortif (++count == MAX_RUN_COUNT) {sort(a, left, right, true);return;}}// 如果在count < MAX_RUN_COUNT(67)的时候,即for循环执行次数少于67次就遍历完了a[],那就说明a[]的有序程度很高,进行merge sort......
}

Arrays.sort(int[])使用的quickSort

这个排序算法NB了,其它的快排算法在测试大量数据集的时候,时间复杂度退化到O(n^2),而这个Dual-privot Quicksort依旧能保持O(n logn)的时间复杂度,代码以后有时间再看吧。

* <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
* by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
* offers O(n log(n)) performance on many data sets that cause other
* quicksorts to degrade to quadratic performance, and is typically
* faster than traditional (one-pivot) Quicksort implementations.

代码分析...

Java中的Arrays.sort(int[])相关推荐

  1. java中的Arrays.sort()的几种用法

    目录 1.第一种 2.第二种方法 3.第三种方法 4.额外补充 for each的语法结构 直奔主题 Arrays.sort()有三种用法 1.第一种 Arrays.sort(int [] a) 查看 ...

  2. Java中关于Arrays.sort的两种重载方法的理解

    前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...

  3. java中关于Arrays.sort()方法的使用

    通过Arrays类事物静态sort()方法可以实现对数组的排序.sort方法提供了多种重载方式,可以对任意类型的数组进行升序排序. 方法摘要: Type Method Description stat ...

  4. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  5. java中byte数组与int类型的转换(两种方式)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  6. java中char类型转换成int类型的两种方法

    java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...

  7. java中set怎么建int型_使用Array.setInt来填充Java中的数组

    为了填充Java中的数组,我们使用Array.setInt()方法.java.lang.reflect.Array.setInt(Object array,int index,int value)方法 ...

  8. Java中的byte[]/char[]/int/String数据类型转换

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51743969 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  9. 在Java中声明一个unsigned int

    本文翻译自:Declaring an unsigned int in Java Is there a way to declare an unsigned int in Java? 有没有办法在Jav ...

最新文章

  1. python 学习总结6 前端学习2
  2. js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))
  3. 整人之bat重启文件
  4. 神经网络optimizer的发展历史整理
  5. get,post请求的编码统一
  6. SpringCloud OpenFeign + Nacos正确打开方式!
  7. 为什么微软要推 ADO.NET Data Services
  8. 关于统计学,几个简单易懂的小故事
  9. 传输层学习之五(TCP的SACK,F-RTO)
  10. 今天将IE升级到了7.0版
  11. 8.6 归纳式迁移学习
  12. 第四次课后作业及Sring类型的应用
  13. CF1399E2 Weights Division (hard version)
  14. h264和h265编码所需要的处理器性能
  15. 大众点评Cat--架构分析
  16. 十道必问的软件测试面试题(含答案解析)
  17. 2.4.XXX 内核配置 介绍
  18. html做一个聊天输入框,js实现简易聊天对话框
  19. 使用selenium爬取fofa中链接的网站正文
  20. 1079: 统计方形

热门文章

  1. JVM|什么是符号引用?
  2. 【C语言】大写字母A转小写字母a
  3. JS——使用VConsole
  4. BIOS-CXL CxlLib 源码解析
  5. 心怀天下?独善其身?彷徨?迷惘?恭喜你发现了宝藏!
  6. 人机工程学座椅设计_人体工程学椅子设计要点 如何设计舒适椅子
  7. win10添加开机自启软件
  8. CCRC信息安全服务资质认证是什么
  9. 可以用ChatGPT搜索论文了
  10. 电脑怎么格式化?跟着这2步就可以啦!