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

