JAVA基礎系列:Arrays.sort()


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】

 

參考網址:

  1. 淺談Arrays.sort()原理

  2. 快速排序算法原理及實現(單軸快速排序、三向切分快速排序、雙軸快速排序)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM