深入理解Arrays.sort()自定義排序原理


深入理解Arrays.sort()自定義排序原理

sort()方法會接受一個比較函數compare(a, b),該函數要比較兩個值,然后返回一個用於說明這兩個值的相對順序的數字。

最后,永遠要記住一句話,凡是返回1或者大於0的正數的時候就要交換位置。(內部實現)

例如:

var arr = [1, 5, 4, 2];

現在要進行升序排列,從左到右的數組項關系最終應該為: a < b < c < d
所以只要在當a大於b的時候去交換它們的位置就好了:

if(a > b ) {
    return 1;
}

簡化后:

// 升序
return a - b;
// 倒序
return b - a;

深入源碼分析可得

我們從Arrays.sort(int[])方法來概述基本類型排序的基本思路:

  • 如果數組元素個數小於NSERTION_SORT_THRESHOLD(47),那么使用改進的插入排序進行排序。
  • 如果元素個數大於插入排序的閾值並且小於快速排序的閾值QUICKSORT_THRESHOLD(286),則使用改進的雙軸快速排序進行排序。
  • 如果元素個數大於快速排序的閾值,根據數組的無序程度來判定繼續使用哪種算法,無序程度通過將數組划分為不同的有序序列的個數來判定,如果有序序列的個數大於MAX_RUN_COUNT(67),則認為原數組基本無序,則仍然使用雙軸快速排序,如果小於MAX_RUN_COUNT,則認為原數組基本有序,使用歸並排序進行排序。


免責聲明!

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



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