JAVA基礎系列:Arrays.sort()

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】

 

參考網址:

  1. 淺談Arrays.sort()原理

  2. 快速排序算法原理及實現(單軸快速排序、三向切分快速排序、雙軸快速排序)
相關文章
相關標籤/搜索