Java Array.sort()源碼分析講解
閱讀起點(diǎn):
Arrays.sort(nums1);
使用ctrl+左鍵進(jìn)入sort()方法
1.Arrays.sort()
關(guān)于sort()
的方法一共有14
個(gè),就目前調(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() {}
,防止實(shí)例化,實(shí)現(xiàn)了sort方法并且定義了以下調(diào)整參數(shù):
//歸并排序的最大運(yùn)行次數(shù) private static final int MAX_RUN_COUNT = 67; //歸并排序的最大運(yùn)行長度 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)先使用計(jì)數(shù)排序而不是插入排序 private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29; //如果要排序的 short 或 char 數(shù)組的長度大于此常數(shù),則優(yōu)先使用計(jì)數(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) {}
進(jìn)入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; }
首先進(jìn)行了判斷,如果要排序的數(shù)組小于
了之前定義的QUICKSORT_THRESHOLD=286
,則優(yōu)先使用快速排序
而不是歸并排序
,即進(jìn)入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){}
進(jìn)入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)記)插入排序還是成對(duì)插入排序,leftmost是表示此部分是否在范圍內(nèi)的最左側(cè),因?yàn)槲覀冏钕乳_始調(diào)用的就是基礎(chǔ)的sort,沒有其他參數(shù),所以就是從頭開始排序,leftmost便默認(rèn)為true
,使用傳統(tǒng)(無標(biāo)記)插入排序,如果為false,使用成對(duì)插入排序。
5.總結(jié)
如果使用最基礎(chǔ)的Arrays.sort()
,那么排序中會(huì)根據(jù)數(shù)組的長度進(jìn)行判斷,數(shù)組越短,length<47
,優(yōu)先選擇插入排序,其次length<286
,選擇快排,其次是歸并排序。
到此這篇關(guān)于Java Array.sort()源碼分析講解的文章就介紹到這了,更多相關(guān)Java Array.sort()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
kafka?消息隊(duì)列中點(diǎn)對(duì)點(diǎn)與發(fā)布訂閱的區(qū)別說明
這篇文章主要介紹了kafka?消息隊(duì)列中點(diǎn)對(duì)點(diǎn)與發(fā)布訂閱的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05java通過客戶端訪問服務(wù)器webservice的方法
這篇文章主要介紹了java通過客戶端訪問服務(wù)器webservice的方法,涉及java創(chuàng)建與調(diào)用webservice的相關(guān)技巧,需要的朋友可以參考下2016-08-08PowerJob的WorkerHealthReporter工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的WorkerHealthReporter工作流程源碼解讀,2023-12-12SpringBoot使用Maven打包異常-引入外部jar的問題及解決方案
這篇文章主要介紹了SpringBoot使用Maven打包異常-引入外部jar,需要的朋友可以參考下2020-06-06java求數(shù)組元素重復(fù)次數(shù)和java字符串比較大小示例
這篇文章主要介紹了java求數(shù)組元素重復(fù)次數(shù)和java字符串比較大小示例,需要的朋友可以參考下2014-04-04Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔
這篇文章主要介紹了Java?SpringBoot集成文件之如何使用POI導(dǎo)出Word文檔,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08