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

JAVA十大排序算法之基數(shù)排序詳解

 更新時(shí)間:2021年08月23日 11:39:07   作者:阿粵Ayue  
這篇文章主要介紹了java中的基數(shù)排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

基數(shù)排序

常見的數(shù)據(jù)元素一般是由若干位組成的,比如字符串由若干字符組成,整數(shù)由若干位0~9數(shù)字組成。

基數(shù)排序按照從右往左的順序,依次將每一位都當(dāng)做一次關(guān)鍵字,然后按照該關(guān)鍵字對(duì)數(shù)組排序,同時(shí)每一輪排序都基于上輪排序后的結(jié)果;當(dāng)我們將所有的位排序后,整個(gè)數(shù)組就達(dá)到有序狀態(tài)?;鶖?shù)排序不是基于比較的算法。

基數(shù)是什么意思?對(duì)于十進(jìn)制整數(shù),每一位都只可能是0~9中的某一個(gè),總共10種可能。那10就是它的基,同理二進(jìn)制數(shù)字的基為2;對(duì)于字符串,如果它使用的是8位的擴(kuò)展ASCII字符集,那么它的基就是256。

基數(shù)排序有兩種方法:

  • MSD 從高位開始進(jìn)行排序
  • LSD 從低位開始進(jìn)行排序

對(duì)于大小范圍為0~9的數(shù)的組合(若是兩位數(shù),就是個(gè)位數(shù)和十位數(shù)的組合),于是可以準(zhǔn)備十個(gè)桶,然后放到對(duì)應(yīng)的桶里,然后再把桶里的數(shù)按照0號(hào)桶到9號(hào)桶的順序取出來(lái)即可。

image-20210809173152835

代碼實(shí)現(xiàn)

public class RadixSort {
    public static final int[] ARRAY = {82, 50, 21, 5, 66, 48, 43, 79, 14, 37, 25};
    public static int[] sort(int[] array) {
        if (array.length < 2) return array;
        //根據(jù)最大值算出位數(shù)
        int max = array[0];
        for (int temp : array) {
            if (temp > max) {
                max = temp;
            }
        }
        //算出位數(shù)digit
        int maxDigit = 0;
        while (max != 0) {
            max /= 10;
            maxDigit++;
        }
        //創(chuàng)建桶并初始化
        ArrayList<ArrayList<Integer>> bucket = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            bucket.add(new ArrayList<>());
        }
        //按照從右往左的順序,依次將每一位都當(dāng)做一次關(guān)鍵字,然后按照該關(guān)鍵字對(duì)數(shù)組排序,每一輪排序都基于上輪排序后的結(jié)果
        int mold = 10;//取模運(yùn)算
        int div = 1;//獲取對(duì)應(yīng)位數(shù)的值
        for (int i = 0; i < maxDigit; i++, mold *= 10, div *= 10) {
            for (int j = 0; j < array.length; j++) {
                //獲取個(gè)位/十位/百位......
                int num = (array[j] % mold) / div;
                //把數(shù)據(jù)放入到對(duì)應(yīng)的桶里
                bucket.get(num).add(array[j]);
            }
            //把桶中的數(shù)據(jù)重新寫回去,并把桶的元素清空,開始第二輪排序
            int index = 0;
            for (int k = 0; k < bucket.size(); k++) {
                //桶中對(duì)應(yīng)的數(shù)據(jù)
                ArrayList<Integer> list = bucket.get(k);
                for (int m = 0; m < list.size(); m++) {
                    array[index++] = list.get(m);
                }
                //清除桶
                bucket.get(k).clear();
            }
        }
        return array;
    }
    public static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + "  ");
        }
        System.out.println("");
    }
    public static void main(String[] args) {
        print(ARRAY);
        System.out.println("============================================");
        print(sort(ARRAY));
    }
}

時(shí)間復(fù)雜度

計(jì)數(shù)排序算法的時(shí)間復(fù)雜度是O(N+M),基數(shù)排序算法執(zhí)行了k次計(jì)數(shù)排序,所以基數(shù)排序算法的時(shí)間復(fù)雜度為O(K(N+M))。

算法穩(wěn)定性

從上面的分析可以看出,相同元素會(huì)按照順序放進(jìn)固定的桶內(nèi),取出的時(shí)候也是按照順序取出來(lái)的,所以基數(shù)排序算法是一種穩(wěn)定的排序算法。

基數(shù)排序 vs 桶排序 vs 計(jì)數(shù)排序

這三種排序算法都利用了桶的概念,但對(duì)桶的使用方法上有明顯差異

  • 基數(shù)排序:根據(jù)每一位的關(guān)鍵字來(lái)分配桶
  • 桶排序:存儲(chǔ)一定范圍的值
  • 計(jì)數(shù)排序:每個(gè)桶只存儲(chǔ)一個(gè)類型值,但是數(shù)量不限

image-20210810001026742

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • SpringBoot四大神器之Actuator的使用小結(jié)

    SpringBoot四大神器之Actuator的使用小結(jié)

    這篇文章主要介紹了SpringBoot四大神器之Actuator的使用小結(jié),詳細(xì)的介紹了Actuator的使用和端點(diǎn)的使用,有興趣的可以了解一下
    2017-11-11
  • Java實(shí)現(xiàn)Dijkstra算法的示例代碼

    Java實(shí)現(xiàn)Dijkstra算法的示例代碼

    Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文主要介紹了實(shí)現(xiàn)這一算法的Java代碼,需要的可以參考一下
    2022-07-07
  • IntelliJ IDEA將導(dǎo)入的項(xiàng)目轉(zhuǎn)成maven項(xiàng)目

    IntelliJ IDEA將導(dǎo)入的項(xiàng)目轉(zhuǎn)成maven項(xiàng)目

    這篇文章主要介紹了IntelliJ IDEA將導(dǎo)入的項(xiàng)目轉(zhuǎn)成maven項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java實(shí)現(xiàn)的DES加密算法詳解

    java實(shí)現(xiàn)的DES加密算法詳解

    這篇文章主要介紹了java實(shí)現(xiàn)的DES加密算法,結(jié)合實(shí)例形式詳細(xì)分析了java實(shí)現(xiàn)DES加密操作的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • java中處理socket通信過程中粘包的情況

    java中處理socket通信過程中粘包的情況

    本篇文章主要介紹了java中處理socket通信過程中粘包的情況,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java之如何正確地對(duì)包裝類進(jìn)行裝箱與拆箱

    Java之如何正確地對(duì)包裝類進(jìn)行裝箱與拆箱

    在這篇文章中給大家繼續(xù)講解包裝類的裝箱和拆箱問題。你可能會(huì)很好奇,做java開發(fā),怎么還裝起箱子來(lái)了?那么就請(qǐng)大家?guī)е苫笸驴窗?/div> 2023-04-04
  • SpringBoot集成WebSocket遇到的問題及解決

    SpringBoot集成WebSocket遇到的問題及解決

    這篇文章主要介紹了SpringBoot集成WebSocket遇到的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-07-07
  • 詳解Java去除json數(shù)據(jù)中的null空值問題

    詳解Java去除json數(shù)據(jù)中的null空值問題

    這篇文章主要介紹了詳解Java去除json數(shù)據(jù)中的null空值問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • JAVA遍歷一個(gè)文件夾中的所有文件的小例子

    JAVA遍歷一個(gè)文件夾中的所有文件的小例子

    在實(shí)際項(xiàng)目中給定一文件夾,得到這個(gè)文件夾下所有的文件這樣的需求并不是很多,更多的是查找或是刪除某一具體的文件
    2013-10-10
  • Mybatis中resultMap的使用總結(jié)

    Mybatis中resultMap的使用總結(jié)

    resultmap是mybatis中最復(fù)雜的元素之一,它描述如何從結(jié)果集中加載對(duì)象,主要作用是定義映射規(guī)則、級(jí)聯(lián)的更新、定制類型轉(zhuǎn)化器。今天通過本文給大家介紹Mybatis中resultMap的使用,感興趣的朋友參考下吧
    2021-06-06

最新評(píng)論

唐海县| 芮城县| 巩留县| 石棉县| 于田县| 庆城县| 静海县| 株洲市| 维西| 宜丰县| 阳曲县| 团风县| 玉田县| 莲花县| 库车县| 赤峰市| 浦城县| 五莲县| 红桥区| 交口县| 泗洪县| 呼玛县| 宝山区| 铅山县| 分宜县| 扎兰屯市| 西平县| 卫辉市| 开封县| 德保县| 保康县| 岳西县| 南投市| 易门县| 郯城县| 庆安县| 城市| 眉山市| 蒙阴县| 台东县| 全州县|