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