Java Array.sort()源碼分析講解
閱讀起點:
Arrays.sort(nums1);
使用ctrl+左鍵進入sort()方法
1.Arrays.sort()
關於sort()
的方法一共有14
個,就目前調用的來看是以下這種最基礎的。
public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0); }
2.DualPivotQuicksort
DualPivotQuicksort
即雙軸快排,定義瞭七種
原始類型的排序方法。DualPivotQuicksort中使用瞭private DualPivotQuicksort() {}
,防止實例化,實現瞭sort方法並且定義瞭以下調整參數:
//歸並排序的最大運行次數 private static final int MAX_RUN_COUNT = 67; //歸並排序的最大運行長度 private static final int MAX_RUN_LENGTH = 33; //如果要排序的數組的長度小於該常數,則優先使用快速排序而不是歸並排序 private static final int QUICKSORT_THRESHOLD = 286; //如果要排序的數組的長度小於此常數,則優先使用插入排序而不是快速排序 private static final int INSERTION_SORT_THRESHOLD = 47; //如果要排序的字節數組的長度大於該常數,則優先使用計數排序而不是插入排序 private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29; //如果要排序的 short 或 char 數組的長度大於此常數,則優先使用計數排序而不是快速排序 private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;
3.DualPivotQuicksort.sort(a, 0, a.length – 1, null, 0, 0);
該方法定義:
static void sort(int[] a, int left, int right,int[] work, int workBase, int workLen) {}
進入DualPivotQuicksort的sort
方法:
static void sort(int[] a, int left, int right, int[] work, int workBase, int workLen) { // Use Quicksort on small arrays if (right - left < QUICKSORT_THRESHOLD) { sort(a, left, right, true); return; }
首先進行瞭判斷,如果要排序的數組小於
瞭之前定義的QUICKSORT_THRESHOLD=286
,則優先使用快速排序
而不是歸並排序
,即進入if中的排序sort(a, left, right, true)
;
4.DualPivotQuicksort.sort(a, left, right, true)
該方法定義:
private static void sort(int[] a, int left, int right, boolean leftmost){}
進入if中的sort(a, left, right, true)
方法,我們隻截取他的邏輯部分而非排序實現部分。
private static void sort(int[] a, int left, int right, boolean leftmost) { int length = right - left + 1; // Use insertion sort on tiny arrays if (leftmost) { /* * Traditional (without sentinel) insertion sort, * optimized for server VM, is used in case of * the leftmost part. */ for (int i = left, j = i; i < right; j = ++i) { int ai = a[i + 1]; while (ai < a[j]) { a[j + 1] = a[j]; if (j-- == left) { break; } } a[j + 1] = ai; } } else {........... ........
該方法中,首先判斷瞭數組長度是否小於INSERTION_SORT_THRESHOLD=47
,如果小於就使用插入排序,而不是快速排序。leftmost
是來選擇使用傳統的(無標記)插入排序還是成對插入排序,leftmost是表示此部分是否在范圍內的最左側,因為我們最先開始調用的就是基礎的sort,沒有其他參數,所以就是從頭開始排序,leftmost便默認為true
,使用傳統(無標記)插入排序,如果為false,使用成對插入排序。
5.總結
如果使用最基礎的Arrays.sort()
,那麼排序中會根據數組的長度進行判斷,數組越短,length<47
,優先選擇插入排序,其次length<286
,選擇快排,其次是歸並排序。
到此這篇關於Java Array.sort()源碼分析講解的文章就介紹到這瞭,更多相關Java Array.sort()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java使用Arrays.sort()方法實現給對象排序
- 詳解Java雙軸快速排序算法
- Java 數據結構與算法系列精講之排序算法
- Java 十大排序算法之插入排序刨析
- Java面試題沖刺第二十三天–算法(2)