国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JDK8 中Arrays.sort() 排序方法解讀

這篇具有很好參考價(jià)值的文章主要介紹了JDK8 中Arrays.sort() 排序方法解讀。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、引言

在刷算法的時(shí)候經(jīng)常需要對(duì)數(shù)組進(jìn)行排序,第一反應(yīng)就是直接使用java.util包下的Arrays.sort()方法直接排序。但在刷算法時(shí)會(huì)通過(guò)時(shí)間復(fù)雜度空間復(fù)雜度對(duì)實(shí)現(xiàn)的算法進(jìn)行評(píng)價(jià),因此我們需對(duì)Arrays.sort()方法有所了解。

本文先行介紹Arrays.sort()中影響排序方式的幾個(gè)因素。影響因素主要為數(shù)組類(lèi)型、數(shù)組大小,結(jié)合閾值對(duì)排序方式進(jìn)行選擇。

二、Arrays.sort()支持類(lèi)型

Arrays.sort()重載了很多方法,支持多種數(shù)據(jù)類(lèi)型的排序。
JDK8 中Arrays.sort() 排序方法解讀

三、核心方法DualPivotQuicksort.sort()

進(jìn)入Arrays.sort()方法的源碼,發(fā)現(xiàn)內(nèi)部主要通過(guò)DualPivotQuicksort.sort()方法實(shí)現(xiàn)排序。該方法通過(guò)數(shù)組大小、類(lèi)型結(jié)合幾個(gè)閾值來(lái)決定使用哪種排序方式。

public static void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

DualPivotQuicksort類(lèi)中的幾個(gè)常量都是比較關(guān)鍵的閾值,決定了該數(shù)組的排序使用哪種方法排序。

    /**
     * 長(zhǎng)度小于286的數(shù)組,優(yōu)先使用快排而不是歸并
     */
    private static final int QUICKSORT_THRESHOLD = 286;

    /**
     * 長(zhǎng)度小于47的數(shù)組,優(yōu)先使用插入而不是快排
     */
    private static final int INSERTION_SORT_THRESHOLD = 47;

    /**
     * 如果是byte數(shù)組,長(zhǎng)度大于29,計(jì)數(shù)排序優(yōu)先于插入排序
     */
    private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29;

    /**
     * 如果是char數(shù)組,長(zhǎng)度大于3200,計(jì)數(shù)排序優(yōu)先于快排
     */
    private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;
1、一般情況的排序方法選擇

簡(jiǎn)單來(lái)說(shuō),會(huì)先計(jì)算需要排序的數(shù)組長(zhǎng)度為n,再根據(jù)n的大小及數(shù)組元素類(lèi)型來(lái)決定使用什么排序。

根據(jù)前兩個(gè)閾值QUICKSORT_THRESHOLD(286)和INSERTION_SORT_THRESHOLD(47),我們可以看到大多數(shù)情況下,排序方法的使用規(guī)則是這樣的,我們規(guī)定需要排序的數(shù)組長(zhǎng)度為n。

  • n < 47,使用插入排序
  • 47 <= n < 286,使用快速排序
  • n >= 286,使用歸并排序

JDK8 中Arrays.sort() 排序方法解讀

2、byte、char類(lèi)型的排序

但是,當(dāng)數(shù)組類(lèi)型為byte或者char時(shí),會(huì)使用到其他兩個(gè)閾值

數(shù)組類(lèi)型為byte時(shí),查看源碼,當(dāng)數(shù)組長(zhǎng)度n(right - left) > 29 (COUNTING_SORT_THRESHOLD_FOR_BYTE),使用計(jì)數(shù)排序,反之,在小數(shù)組的情況下使用插入排序

static void sort(byte[] a, int left, int right) {
        // Use counting sort on large arrays
        if (right - left > COUNTING_SORT_THRESHOLD_FOR_BYTE) {
          int[] count = new int[NUM_BYTE_VALUES];
          ... }  else { // Use insertion sort on small arrays
        }
}

數(shù)組類(lèi)型為char時(shí),查看源碼實(shí)現(xiàn),當(dāng)數(shù)組長(zhǎng)度n(right - left) < 3200 (COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR ) ,使用計(jì)數(shù)排序,反之,使用雙軸快排。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434461.html

static void sort(char[] a, int left, int right,
                     char[] work, int workBase, int workLen) {
        // Use counting sort on large arrays
        if (right - left > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) {
            int[] count = new int[NUM_CHAR_VALUES];
          ...
        } else { // Use Dual-Pivot Quicksort on small arrays
            doSort(a, left, right, work, workBase, workLen);
        }
}

到了這里,關(guān)于JDK8 中Arrays.sort() 排序方法解讀的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java創(chuàng)建一個(gè)長(zhǎng)度為10的數(shù)組,利用Arrays.sort(), 為數(shù)組元素排序

    Java創(chuàng)建一個(gè)長(zhǎng)度為10的數(shù)組,利用Arrays.sort(), 為數(shù)組元素排序

    程序要求:1)創(chuàng)建一個(gè)整型數(shù)組,數(shù)組的長(zhǎng)度為10. ? ??????????????????2)給數(shù)組元素賦值,要求亂序。 ? ? ? ? ? ? ? ? ? 3)利用fori循環(huán)將數(shù)組元素依次輸出。 ?? ? ? ? ? ? ? ? ? ? 4)利用Arrays.sort(), 為數(shù)組元素排序 ? ? ? ? ? ? ? ? ? 5)采用增加for循環(huán)將

    2024年02月08日
    瀏覽(30)
  • JDK8新特性之方法引用【 ::】

    JDK8新特性之方法引用【 ::】

    接下來(lái)看看由輝輝所寫(xiě)的關(guān)于方法引用的相關(guān)操作吧 目錄 ????Welcome Huihui\\\'s Code World ! !???? 一.是什么 二.為什么要用 三.什么時(shí)候用 四.怎么用 常見(jiàn)的引用方式 ?符號(hào)表示: “ ::” 是一種引用運(yùn)算符,它所在的表達(dá)式稱(chēng)為方法引用? 1.簡(jiǎn)化代碼 方法引用可以將復(fù)雜的代

    2024年02月11日
    瀏覽(47)
  • 【排序算法詳細(xì)介紹】桶排序(Bucket Sort)冒泡排序(Bubble Sort)快速排序(Quick Sort)

    今天學(xué)習(xí)了一些簡(jiǎn)單的 排序算法 ,其實(shí)在我們平時(shí)解決問(wèn)題中經(jīng)常用到,今天正好一起看了看,記錄一下。 如果對(duì)你也有幫助,我很開(kāi)心~ 桶排序是一種排序算法,它將數(shù)組劃分為一些 有序的桶 ,然后 每個(gè)桶再分別排序 。最后,將所有的桶合并起來(lái),得到一個(gè)有序的數(shù)組。桶排

    2024年01月25日
    瀏覽(19)
  • 排序算法(stable_sort(), sort())

    sort函數(shù)我相信大家都不陌生,今天介紹一個(gè)新的排序算法stable_sort stable_sort:穩(wěn)定排序算法,維持相等元素的原有順序。 假如我們定義一個(gè)字符串?dāng)?shù)組 這些字符串是按照字典序排列的,我們現(xiàn)在想要words按照單詞長(zhǎng)度從小到大重排的同時(shí),還希望具有相同長(zhǎng)度的元素按照字典

    2024年02月07日
    瀏覽(23)
  • 【排序算法】堆排序(Heap Sort)

    【排序算法】堆排序(Heap Sort)

    堆排序是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。堆是一個(gè)近似完全二叉樹(shù)的結(jié)構(gòu),并同時(shí)滿(mǎn)足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。 學(xué)習(xí)堆排序之前,有必要了解堆!若讀者不熟悉堆,建議先了解堆(建議可以通過(guò)二叉堆,左傾堆,

    2024年02月01日
    瀏覽(21)
  • arrays.sort用法詳解

    大家好,我是免費(fèi)搭建查券返利機(jī)器人賺傭金就用微賺淘客系統(tǒng)3.0的小編,也是冬天不穿秋褲,天冷也要風(fēng)度的程序猿!在編程的世界中,數(shù)組(arrays)是一種常見(jiàn)且重要的數(shù)據(jù)結(jié)構(gòu),而在Java中,對(duì)數(shù)組進(jìn)行排序是經(jīng)常遇到的需求之一。今天,我們將深入探討Java中的 Arrays

    2024年02月04日
    瀏覽(21)
  • 46,排序算法sort

    排序算法sort 常用排序算法 sort 學(xué)習(xí)目標(biāo): 掌握i常用排序算法 算法簡(jiǎn)介: sort //對(duì)容器內(nèi)元素進(jìn)行排序 random_shuffle //洗牌,指定范圍內(nèi)的元素隨機(jī)調(diào)整次序 merge //容器元素合并,并存儲(chǔ)到另一容器中 reverse //反轉(zhuǎn)指定范圍的元素 功能描述: 對(duì)容器內(nèi)元素進(jìn)行排序 函數(shù)原型:

    2024年02月16日
    瀏覽(28)
  • 【算法】桶排序(Bucket Sort)詳解

    【算法】桶排序(Bucket Sort)詳解

    桶排序(Bucket Sort)又稱(chēng)箱排序,是一種比較常用的排序算法。其算法原理是將數(shù)組分到有限數(shù)量的桶里,再對(duì)每個(gè)桶分別排好序(可以是遞歸使用桶排序,也可以是使用其他排序算法將每個(gè)桶分別排好序),最后一次將每個(gè)桶中排好序的數(shù)輸出。 桶排序的思想就是把待排序

    2024年01月24日
    瀏覽(24)
  • JDK8中的新特性(Lambda、函數(shù)式接口、方法引用、Stream)

    JDK8中的新特性(Lambda、函數(shù)式接口、方法引用、Stream)

    1.1 關(guān)于Java8新特性簡(jiǎn)介 Java 8 (又稱(chēng)為 JDK 8或JDK1.8) 是 Java 語(yǔ)言開(kāi)發(fā)的一個(gè)主要版本。 Java 8 是oracle公司于2014年3月發(fā)布,可以看成是自Java 5 以來(lái) 最具革命性 的版本。Java 8為Java語(yǔ)言、編譯器、類(lèi)庫(kù)、開(kāi)發(fā)工具與JVM帶來(lái)了大量新特性。 特性: 速度更快 代碼更少(增加了新的語(yǔ)法

    2024年02月05日
    瀏覽(28)
  • Ubuntu之a(chǎn)pt-get系列--安裝JDK8--方法/教程

    Ubuntu之a(chǎn)pt-get系列--安裝JDK8--方法/教程

    原文網(wǎng)址:Ubuntu之a(chǎn)pt-get--安裝JDK8--方法/教程_IT利刃出鞘的博客 本文介紹如何在Ubuntu下安裝JDK8。 可以通過(guò)如下命令判斷系統(tǒng)是否已安裝jdk: 命令 結(jié)果 如上所示,表示還沒(méi)有安裝。 結(jié)果: 本處我安裝openjdk-8-jdk 可以通過(guò)apt安裝,命令如下: 命令 結(jié)果 如上則表示安裝成功,

    2024年02月10日
    瀏覽(50)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包