23.基數(shù)排序

1.基數(shù)排序介紹

基數(shù)排序是將整數(shù)按照位數(shù)切割成不同的數(shù)字,然后按每個(gè)位數(shù)分別比較有梆。

2.思路分析:

上面的概念還是比較難懂的骆撇,通過例子來講一下。比如一組數(shù)據(jù)arr={53,3,542,748,14,214},使用基數(shù)排序進(jìn)行升序排序羽德。首先需要準(zhǔn)備10個(gè)數(shù)組(桶)几莽,0-9分別對(duì)應(yīng)位數(shù)的0-9。
第一輪:

  • 得到每個(gè)整數(shù)的個(gè)位數(shù)宅静,比如53的個(gè)位數(shù)為3章蚣,就53放入到下標(biāo)為3的桶中
  • 然后從0-9個(gè)桶中按照元素加入的順序?qū)⒃厝〕觯湃氲皆葦?shù)組中姨夹。
    一輪排序后: arr={542,53,3,14,214,748}

第二輪:
得到每個(gè)整數(shù)的十位數(shù)纤垂,重復(fù)第一輪步驟。比如3的十位數(shù)為0磷账,將3放入到下標(biāo)為0的桶中峭沦。
第二輪排序后:arr = {3,14,214,542,748,53}

第三輪:
得到每個(gè)整數(shù)的百位數(shù),重復(fù)上述步驟逃糟。比如542的百位數(shù)為5吼鱼,將542放入到小標(biāo)為5的桶中。
第三輪排序后:arr = {3,14,53,214,542,748}
至此排序結(jié)束绰咽。

3.推導(dǎo)過程

package com.yc.day04;

import java.util.Arrays;

public class RadixSort {
    public static void main(String[] args) {
        int arr[] = {53,3,542,748,14,214};
        radixSort(arr);
    }
    public static void radixSort(int[]arr){
        //定義一個(gè)二維數(shù)組來存儲(chǔ)是10個(gè)桶,
        // 因?yàn)椴恢矫總€(gè)桶中具體會(huì)存多少個(gè)元素菇肃,所以定義桶的大小為arr.length
        int [][] bucket = new int[10][arr.length];
        //定義一個(gè)一維數(shù)組來記錄每個(gè)桶中有多少個(gè)元素
        int [] elementCount = new int[10];
        //第一輪
        for (int i = 0; i < arr.length; i++) {
            //得到個(gè)位數(shù)
            int digit = arr[i]%10;
            //將元素放到對(duì)應(yīng)的桶中
            bucket[digit][elementCount[digit]] = arr[i];
            elementCount[digit] +=1;
        }
        //將各個(gè)桶中的元素取出,放到原始數(shù)組中
        int index = 0;
        for (int j = 0; j < elementCount.length; j++) {
            if (elementCount[j] != 0) {
                for (int k = 0; k < elementCount[j]; k++) {
                    arr[index] = bucket[j][k];
                    index++;
                }
            }
            //將桶清空
            elementCount[j] = 0;
        }
        System.out.println("第一輪排序后:"+ Arrays.toString(arr));
        //========================================
        //第二輪
        for (int i = 0; i < arr.length; i++) {
            int digit = arr[i]/10%10;
            bucket[digit][elementCount[digit]] = arr[i];
            elementCount[digit] +=1;
        }
        index = 0;
        for (int j=0;j<elementCount.length;j++){
            if(elementCount[j]!=0){
                for(int k=0;k<elementCount[j];k++){
                    arr[index] = bucket[j][k];
                    index++;
                }
            }
            //將第j個(gè)桶清空
            elementCount[j] = 0;
        }
        System.out.println("第二輪排序后:"+ Arrays.toString(arr));
        //第三輪
        for(int i=0;i<arr.length;i++){
            int digit = arr[i]/10/10%10;
            bucket[digit][elementCount[digit]] = arr[i];
            elementCount[digit] ++;
        }
        index = 0;
        for(int j=0;j<elementCount.length;j++){
            if(elementCount[j]!=0){
                for(int k=0;k<elementCount[j];k++){
                  arr[index] = bucket[j][k];
                  index++;
                }
            }
            elementCount[j] = 0;
        }
        System.out.println("第三輪排序后:"+ Arrays.toString(arr));
    }

}

4.完整代碼

package com.yc.day04;

import java.util.Arrays;

public class RadixSort {
    public static void main(String[] args) {
        int arr[] = {53,3,542,748,14,214};
        radixSort(arr);
    }
    public static void radixSort(int[]arr){
        //定義一個(gè)二維數(shù)組來存儲(chǔ)是10個(gè)桶,
        // 因?yàn)椴恢矫總€(gè)桶中具體會(huì)存多少個(gè)元素取募,所以定義桶的大小為arr.length
        int [][] bucket = new int[10][arr.length];
        //定義一個(gè)一維數(shù)組來記錄每個(gè)桶中有多少個(gè)元素
        int [] elementCount = new int[10];
        //得到最大值
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if(arr[i]>max){
                max = arr[i];
            }
        }
        int maxLength = (max+"").length();
        for(int i=0,n=1;i<maxLength;i++,n*=10){
            //將元素按照個(gè)位琐谤、十位、百位等等存入到對(duì)應(yīng)的桶中
            for(int j=0;j<arr.length;j++){
                int digit = arr[j]/n%10;
                bucket[digit][elementCount[digit]] = arr[j];
                elementCount[digit]++;
            }
            //依次從桶中取出元素放入到原數(shù)組中
            int index = 0;
            for(int k=0;k<elementCount.length;k++){
                if(elementCount[k]!=0){
                    for(int m = 0;m<elementCount[k];m++){
                        arr[index] = bucket[k][m];
                        index++;
                    }
                }
                //清空桶
                elementCount[k] = 0;
            }
            System.out.println("第"+i+1+"輪基數(shù)排序后:"+Arrays.toString(arr));
        }

        /**
        //第一輪
        for (int i = 0; i < arr.length; i++) {
            //得到個(gè)位數(shù)
            int digit = arr[i]%10;
            //將元素放到對(duì)應(yīng)的桶中
            bucket[digit][elementCount[digit]] = arr[i];
            elementCount[digit] +=1;
        }
        //將各個(gè)桶中的元素取出玩敏,放到原始數(shù)組中
        int index = 0;
        for (int j = 0; j < elementCount.length; j++) {
            if (elementCount[j] != 0) {
                for (int k = 0; k < elementCount[j]; k++) {
                    arr[index] = bucket[j][k];
                    index++;
                }
            }
            //將桶清空
            elementCount[j] = 0;
        }
        System.out.println("第一輪排序后:"+ Arrays.toString(arr));
        //========================================
        //第二輪
        for (int i = 0; i < arr.length; i++) {
            int digit = arr[i]/10%10;
            bucket[digit][elementCount[digit]] = arr[i];
            elementCount[digit] +=1;
        }
        index = 0;
        for (int j=0;j<elementCount.length;j++){
            if(elementCount[j]!=0){
                for(int k=0;k<elementCount[j];k++){
                    arr[index] = bucket[j][k];
                    index++;
                }
            }
            //將第j個(gè)桶清空
            elementCount[j] = 0;
        }
        System.out.println("第二輪排序后:"+ Arrays.toString(arr));
        //第三輪
        for(int i=0;i<arr.length;i++){
            int digit = arr[i]/10/10%10;
            bucket[digit][elementCount[digit]] = arr[i];
            elementCount[digit] ++;
        }
        index = 0;
        for(int j=0;j<elementCount.length;j++){
            if(elementCount[j]!=0){
                for(int k=0;k<elementCount[j];k++){
                  arr[index] = bucket[j][k];
                  index++;
                }
            }
            elementCount[j] = 0;
        }
        System.out.println("第三輪排序后:"+ Arrays.toString(arr));
        **/
     }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斗忌,一起剝皮案震驚了整個(gè)濱河市质礼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌织阳,老刑警劉巖几苍,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陈哑,居然都是意外死亡妻坝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門惊窖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刽宪,“玉大人,你說我怎么就攤上這事界酒∈ブ簦” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵毁欣,是天一觀的道長(zhǎng)庇谆。 經(jīng)常有香客問我,道長(zhǎng)凭疮,這世上最難降的妖魔是什么饭耳? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮执解,結(jié)果婚禮上寞肖,老公的妹妹穿的比我還像新娘。我一直安慰自己衰腌,他們只是感情好新蟆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著右蕊,像睡著了一般琼稻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶囚,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天帕翻,我揣著相機(jī)與錄音,去河邊找鬼坯约。 笑死熊咽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的闹丐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼被因,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼卿拴!你這毒婦竟也來了衫仑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤堕花,失蹤者是張志新(化名)和其女友劉穎文狱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缘挽,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞄崇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壕曼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苏研。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腮郊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轧飞,我是刑警寧澤大渤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布切黔,位于F島的核電站纬霞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伏恐。R本人自食惡果不足惜翠桦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一斗幼、第九天 我趴在偏房一處隱蔽的房頂上張望谋逻。 院中可真熱鬧毁兆,春花似錦屯吊、人聲如沸骗爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薇组。三九已至外臂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間律胀,已是汗流浹背宋光。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炭菌,地道東北人罪佳。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黑低,于是被迫代替她去往敵國(guó)和親赘艳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容