JDK 1.8 java.util.Arrays.class(rt.jar)html
1. Collections.sort方法底层就是调用的Arrays.sort方法。java
2. Java Arrays中提供了对全部类型的排序。其中主要分为Primitive(8种基本类型)和Object两大类。 算法
基本类型:插入排序、调优的快速排序和归并排序相结合的排序方法
对象类型:改进的归并排序和插入排序相结合的方法数组
以int[]数组为例:<47 插入排序;>=47 && <286 快排; >286 归并排序。ide
3. 双轴快排:post
快速排序使用的是分治思想,将原问题分红若干个子问题进行递归解决。选择一个元素做为轴(pivot),经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比轴元素小,另一部分的全部数据都比轴元素大,而后再按此方法对这两部分数据分别进行快速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列。
双轴快排(DualPivotQuicksort),顾名思义有两个轴元素pivot1,pivot2,且pivot ≤ pivot2,将序列分红三段:x < pivot一、pivot1 ≤ x ≤ pivot二、x >pivot2,而后分别对三段进行递归。这个算法一般会比传统的快排效率更高,也所以被做为Arrays.java中给基本类型的数据排序的具体实现。
性能
4. Arrays.sort对升序数组、降序数组和重复数组的排序效率有了很大的提高,这里面有几个重大的优化。优化
1.对于小数组来讲,插入排序效率更高,每次递归到小于47的大小时,用插入排序代替快排,明显提高了性能。
2.双轴快排使用两个pivot,每轮把数组分红3段,在没有明显增长比较次数的状况下巧妙地减小了递归次数。
3.pivot的选择上增长了随机性,却没有带来随机数的开销。
4.对重复数据进行了优化处理,避免了没必要要交换和递归。
ui
5. Arrays.sort()默认的是升序排序,降序排序可采用Collection.sort()匿名内部类。url
//降序,可用Comparator()匿名内部类 Arrays.sort(array, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } });
6. Arrays.sort(int[] a, int fromIndex, int toIndex)
从0开始数,【fromIndex,toIndex】
从1开始数, ( fromIndex,toIndex】
参考网址: