Java中的Arrays.sort(int[])
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[])相关推荐
- java中的Arrays.sort()的几种用法
目录 1.第一种 2.第二种方法 3.第三种方法 4.额外补充 for each的语法结构 直奔主题 Arrays.sort()有三种用法 1.第一种 Arrays.sort(int [] a) 查看 ...
- Java中关于Arrays.sort的两种重载方法的理解
前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...
- java中关于Arrays.sort()方法的使用
通过Arrays类事物静态sort()方法可以实现对数组的排序.sort方法提供了多种重载方式,可以对任意类型的数组进行升序排序. 方法摘要: Type Method Description stat ...
- java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)
java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...
- java中byte数组与int类型的转换(两种方式)
java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...
- java中char类型转换成int类型的两种方法
java中char类型转换成int类型的两种方法 方法一: 第一种利用Integer包装类的方法Integer.parseInt Copychar ch = '9'; if (Character.is ...
- java中set怎么建int型_使用Array.setInt来填充Java中的数组
为了填充Java中的数组,我们使用Array.setInt()方法.java.lang.reflect.Array.setInt(Object array,int index,int value)方法 ...
- Java中的byte[]/char[]/int/String数据类型转换
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51743969 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...
- 在Java中声明一个unsigned int
本文翻译自:Declaring an unsigned int in Java Is there a way to declare an unsigned int in Java? 有没有办法在Jav ...
最新文章
- python 学习总结6 前端学习2
- js立即执行函数: (function ( ){...})( ) 与 (function ( ){...}( ))
- 整人之bat重启文件
- 神经网络optimizer的发展历史整理
- get,post请求的编码统一
- SpringCloud OpenFeign + Nacos正确打开方式!
- 为什么微软要推 ADO.NET Data Services
- 关于统计学,几个简单易懂的小故事
- 传输层学习之五(TCP的SACK,F-RTO)
- 今天将IE升级到了7.0版
- 8.6 归纳式迁移学习
- 第四次课后作业及Sring类型的应用
- CF1399E2 Weights Division (hard version)
- h264和h265编码所需要的处理器性能
- 大众点评Cat--架构分析
- 十道必问的软件测试面试题(含答案解析)
- 2.4.XXX 内核配置 介绍
- html做一个聊天输入框,js实现简易聊天对话框
- 使用selenium爬取fofa中链接的网站正文
- 1079: 统计方形