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】
參考網址: