最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Array.sort()源碼分析講解

 更新時間:2022年08月24日 11:51:27   作者:Log1119  
Arrays類中有一個sort()方法,該方法是Arrays類的靜態(tài)方法,在需要對數組進行排序時,非常的好用。但是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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在Java中將List轉換為String輸出過程解析

    在Java中將List轉換為String輸出過程解析

    這篇文章主要介紹了在Java中將List轉換為String輸出過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java垃圾回收機制算法詳解

    Java垃圾回收機制算法詳解

    這篇文章主要介紹了Java垃圾回收機制算法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • SpringBoot快速設置攔截器并實現(xiàn)權限驗證的方法

    SpringBoot快速設置攔截器并實現(xiàn)權限驗證的方法

    本篇文章主要介紹了SpringBoot快速設置攔截器并實現(xiàn)權限驗證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 基于String變量的兩種創(chuàng)建方式(詳解)

    基于String變量的兩種創(chuàng)建方式(詳解)

    下面小編就為大家?guī)硪黄赟tring變量的兩種創(chuàng)建方式(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java學習基礎之安裝JDK/配置JDK環(huán)境&IEDA工具安裝

    Java學習基礎之安裝JDK/配置JDK環(huán)境&IEDA工具安裝

    這篇文章主要介紹了Java學習基礎系列文章的第一篇,主要內容是安裝JDK/配置JDK環(huán)境&IEDA工具安裝的相關資料,需要的朋友可以參考下
    2020-02-02
  • Spring中的ConversionService源碼解析

    Spring中的ConversionService源碼解析

    這篇文章主要介紹了Spring中的ConversionService源碼解析,ConversionService是類型轉換服務的接口,從名字就可以看出ConverterRegistry是要實現(xiàn)轉換器注冊表的接口,添加和移除Converter和GenericConverter,需要的朋友可以參考下
    2023-11-11
  • java定義數組的三種類型總結

    java定義數組的三種類型總結

    下面小編就為大家?guī)硪黄猨ava定義數組的三種類型總結。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Java超詳細講解設計模式中的命令模式

    Java超詳細講解設計模式中的命令模式

    命令模式是將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化,對請求排隊或者對請求做日志記錄,以及可以支持撤銷的操作
    2022-04-04
  • Spring Cloud Eureka 注冊與發(fā)現(xiàn)操作步驟詳解

    Spring Cloud Eureka 注冊與發(fā)現(xiàn)操作步驟詳解

    這篇文章主要介紹了Spring Cloud Eureka 注冊與發(fā)現(xiàn)操作步驟詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 比較排序之冒泡排序的實現(xiàn)

    比較排序之冒泡排序的實現(xiàn)

    下面小編就為大家?guī)硪黄容^排序之冒泡排序的小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧實現(xiàn)。
    2017-06-06

最新評論

阳朔县| 集贤县| 永和县| 文成县| 长沙市| 紫金县| 云和县| 基隆市| 高唐县| 板桥市| 海阳市| 九龙县| 永和县| 开封县| 临高县| 平陆县| 汤阴县| 武胜县| 台北县| 武清区| 锡林浩特市| 塘沽区| 无为县| 兴宁市| 宕昌县| 讷河市| 齐齐哈尔市| 申扎县| 安西县| 台安县| 芮城县| 抚宁县| 贵德县| 淮安市| 巫溪县| 清远市| 高安市| 新宁县| 醴陵市| 开封县| 广德县|