JDK 1.8 java.util.Arrays.class(rt.jar)
1. Collections.sort方法底层就是调用的Arrays.sort方法。
2. Java Arrays中提供了对所有类型的排序。其中主要分为Primitive(8种基本类型)和Object两大类。
基本类型:插入排序、调优的快速排序和归并排序相结合的排序方法
对象类型:改进的归并排序和插入排序相结合的方法
以int[]数组为例:<47 插入排序;>=47 && <286 快排; >286 归并排序。
3. 双轴快排:
快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决。选择一个元素作为轴(pivot),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比轴元素小,另外一部分的所有数据都比轴元素大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
双轴快排(DualPivotQuicksort),顾名思义有两个轴元素pivot1,pivot2,且pivot ≤ pivot2,将序列分成三段:x < pivot1、pivot1 ≤ x ≤ pivot2、x >pivot2,然后分别对三段进行递归。这个算法通常会比传统的快排效率更高,也因此被作为Arrays.java中给基本类型的数据排序的具体实现。
4. Arrays.sort对升序数组、降序数组和重复数组的排序效率有了很大的提升,这里面有几个重大的优化。
1.对于小数组来说,插入排序效率更高,每次递归到小于47的大小时,用插入排序代替快排,明显提升了性能。
2.双轴快排使用两个pivot,每轮把数组分成3段,在没有明显增加比较次数的情况下巧妙地减少了递归次数。
3.pivot的选择上增加了随机性,却没有带来随机数的开销。
4.对重复数据进行了优化处理,避免了不必要交换和递归。
5. Arrays.sort()默认的是升序排序,降序排序可采用Collection.sort()匿名内部类。
//降序,可用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】
参考网址: