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() {},防止實例化,實現(xiàn)了sort方法并且定義了以下調整參數:
//歸并排序的最大運行次數 private static final int MAX_RUN_COUNT = 67; //歸并排序的最大運行長度 private static final int MAX_RUN_LENGTH = 33; //如果要排序的數組的長度小于該常數,則優(yōu)先使用快速排序而不是歸并排序 private static final int QUICKSORT_THRESHOLD = 286; //如果要排序的數組的長度小于此常數,則優(yōu)先使用插入排序而不是快速排序 private static final int INSERTION_SORT_THRESHOLD = 47; //如果要排序的字節(jié)數組的長度大于該常數,則優(yōu)先使用計數排序而不是插入排序 private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29; //如果要排序的 short 或 char 數組的長度大于此常數,則優(yōu)先使用計數排序而不是快速排序 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,則優(yōu)先使用快速排序而不是歸并排序,即進入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)方法,我們只截取他的邏輯部分而非排序實現(xiàn)部分。
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是來選擇使用傳統(tǒng)的(無標記)插入排序還是成對插入排序,leftmost是表示此部分是否在范圍內的最左側,因為我們最先開始調用的就是基礎的sort,沒有其他參數,所以就是從頭開始排序,leftmost便默認為true,使用傳統(tǒng)(無標記)插入排序,如果為false,使用成對插入排序。
5.總結
如果使用最基礎的Arrays.sort(),那么排序中會根據數組的長度進行判斷,數組越短,length<47,優(yōu)先選擇插入排序,其次length<286,選擇快排,其次是歸并排序。
到此這篇關于Java Array.sort()源碼分析講解的文章就介紹到這了,更多相關Java Array.sort()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot快速設置攔截器并實現(xiàn)權限驗證的方法
本篇文章主要介紹了SpringBoot快速設置攔截器并實現(xiàn)權限驗證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Java學習基礎之安裝JDK/配置JDK環(huán)境&IEDA工具安裝
這篇文章主要介紹了Java學習基礎系列文章的第一篇,主要內容是安裝JDK/配置JDK環(huán)境&IEDA工具安裝的相關資料,需要的朋友可以參考下2020-02-02
Spring Cloud Eureka 注冊與發(fā)現(xiàn)操作步驟詳解
這篇文章主要介紹了Spring Cloud Eureka 注冊與發(fā)現(xiàn)操作步驟詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03

