欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

基數(shù)排序

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

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

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

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

  • MSD 從高位開始進行排序
  • LSD 從低位開始進行排序

對于大小范圍為0~9的數(shù)的組合(若是兩位數(shù),就是個位數(shù)和十位數(shù)的組合),于是可以準備十個桶,然后放到對應的桶里,然后再把桶里的數(shù)按照0號桶到9號桶的順序取出來即可。

image-20210809173152835

代碼實現(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<>());
        }
        //按照從右往左的順序,依次將每一位都當做一次關鍵字,然后按照該關鍵字對數(shù)組排序,每一輪排序都基于上輪排序后的結果
        int mold = 10;//取模運算
        int div = 1;//獲取對應位數(shù)的值
        for (int i = 0; i < maxDigit; i++, mold *= 10, div *= 10) {
            for (int j = 0; j < array.length; j++) {
                //獲取個位/十位/百位......
                int num = (array[j] % mold) / div;
                //把數(shù)據(jù)放入到對應的桶里
                bucket.get(num).add(array[j]);
            }
            //把桶中的數(shù)據(jù)重新寫回去,并把桶的元素清空,開始第二輪排序
            int index = 0;
            for (int k = 0; k < bucket.size(); k++) {
                //桶中對應的數(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ù)排序算法的時間復雜度是O(N+M),基數(shù)排序算法執(zhí)行了k次計數(shù)排序,所以基數(shù)排序算法的時間復雜度為O(K(N+M))。

算法穩(wěn)定性

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

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

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

  • 基數(shù)排序:根據(jù)每一位的關鍵字來分配桶
  • 桶排序:存儲一定范圍的值
  • 計數(shù)排序:每個桶只存儲一個類型值,但是數(shù)量不限

image-20210810001026742

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • 淺談String類型如何轉換為time類型存進數(shù)據(jù)庫

    淺談String類型如何轉換為time類型存進數(shù)據(jù)庫

    這篇文章主要介紹了String類型如何轉換為time類型存進數(shù)據(jù)庫,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java微信開發(fā)API第四步 微信自定義個性化菜單實現(xiàn)

    java微信開發(fā)API第四步 微信自定義個性化菜單實現(xiàn)

    這篇文章主要為大家詳細介紹了java微信開發(fā)API第四步,自定義菜單以及個性化菜單實現(xiàn) ,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java如何連續(xù)執(zhí)行多條cmd命令

    java如何連續(xù)執(zhí)行多條cmd命令

    這篇文章主要介紹了java如何連續(xù)執(zhí)行多條cmd命令的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring中的Devtools源碼解析

    Spring中的Devtools源碼解析

    這篇文章主要介紹了Spring中的Devtools源碼解析,Spring中的Devtools是一個開發(fā)工具,旨在提高開發(fā)人員的生產(chǎn)力和開發(fā)體驗,它提供了一系列功能,包括自動重啟、熱部署、遠程調試等,使開發(fā)人員能夠更快速地進行代碼修改和調試,需要的朋友可以參考下
    2023-10-10
  • IDEA中的.iml文件和.idea文件夾

    IDEA中的.iml文件和.idea文件夾

    這篇文章主要介紹了IDEA中的.iml文件和.idea文件夾,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Spring Cloud Config分布式配置中心使用介紹詳解

    Spring Cloud Config分布式配置中心使用介紹詳解

    分布式配置中心應用場景 往往,我們使用配置文件管理?些配置信息,比如application.yml 單體應用架構:配置信息的管理、維護并不會顯得特別麻煩,手動操作就可以,因為就一個工程
    2022-09-09
  • mybatis中映射文件include標簽的應用

    mybatis中映射文件include標簽的應用

    這篇文章主要介紹了mybatis中映射文件include標簽的應用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java的@Transactional、@Aysnc、事務同步問題詳解

    Java的@Transactional、@Aysnc、事務同步問題詳解

    這篇文章主要介紹了Java的@Transactional、@Aysnc、事務同步問題詳解,現(xiàn)在我們需要在一個業(yè)務方法中插入一個用戶,這個業(yè)務方法我們需要加上事務,然后插入用戶后,我們要異步的方式打印出數(shù)據(jù)庫中所有存在的用戶,需要的朋友可以參考下
    2023-11-11
  • 基于swagger測試List類型參數(shù)過程詳解

    基于swagger測試List類型參數(shù)過程詳解

    這篇文章主要介紹了基于swagger測試List類型參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • java使用ffmpeg命令來實現(xiàn)視頻編碼轉換的示例

    java使用ffmpeg命令來實現(xiàn)視頻編碼轉換的示例

    本文主要介紹了java使用ffmpeg命令來實現(xiàn)視頻編碼轉換的示例,可以通過調用系統(tǒng)命令來執(zhí)行FFmpeg命令,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07

最新評論