算法(一)之排序算法(五)——鏈?zhǔn)交鶖?shù)排序(LinkedRadixSort)

基數(shù)排序(RadixSort)也是八大排序算法之一瞧筛,它在棋牌游戲中的應(yīng)用非常常見。基數(shù)排序是采用“分配”與“收集”的辦法奶陈,用對多關(guān)鍵碼進(jìn)行排序的思想實(shí)現(xiàn)對單關(guān)鍵碼進(jìn)行排序的方法怯屉。我們這里只分析在平常開發(fā)生活中會(huì)用到的場景蔚舀,而不具體去研究。

思路:使用鏈表存儲(chǔ)數(shù)據(jù)锨络,通過調(diào)整指針實(shí)現(xiàn)LSD(低關(guān)鍵字優(yōu)先)算法進(jìn)行排序赌躺。

舉個(gè)例子就是我們在qq游戲上的紙牌或麻將,從服務(wù)器端返回來一組數(shù)據(jù)羡儿,紙牌和麻將都是多關(guān)鍵字的對象礼患,紙牌和麻將都是有點(diǎn)數(shù)和花色劃分的,我們要對這組數(shù)據(jù)進(jìn)行排序,那使用鏈?zhǔn)交鶖?shù)排序效率是最快的缅叠。
而且這種排序是使用在對原始數(shù)據(jù)的排序咏瑟,如果有新數(shù)據(jù)添加進(jìn)來的話,那就使用希爾排序痪署。

以麻將為例码泞,請看圖:

(1)先初始化一個(gè)要存放的點(diǎn)數(shù)的集合數(shù)組,根據(jù)點(diǎn)數(shù)把數(shù)據(jù)放入對應(yīng)的數(shù)組中狼犯,把點(diǎn)數(shù)為1的數(shù)放入數(shù)組為0的下標(biāo)中, 點(diǎn)數(shù)為2的數(shù)據(jù)放入1的下標(biāo)中余寥,數(shù)組中每個(gè)下標(biāo)存放數(shù)據(jù)的都是一個(gè)集合,這樣就可以把數(shù)值為1~9的麻將分別存入對應(yīng)的數(shù)組中悯森。然后再把數(shù)組中的集合按順序依次添加到一個(gè)新的集合中宋舷。

(2)初始化一個(gè)存放花色的集合數(shù)組,根據(jù)花色把數(shù)據(jù)放入對應(yīng)的組中瓢姻,把花色為萬字的數(shù)據(jù)放入數(shù)組為0的下標(biāo)中祝蝠,花色為條字的數(shù)據(jù)放入數(shù)組為1的下標(biāo)中,花色為筒字的數(shù)據(jù)放入數(shù)組為2的下標(biāo)中幻碱,這樣就可以把花色為萬筒條的數(shù)據(jù)都存入對應(yīng)的數(shù)組中绎狭。最后再把數(shù)組中的集合桉樹按順序依次添加到一個(gè)新的集合當(dāng)中。

這樣就完成了麻將的排序褥傍。光說也是說不清楚的儡嘶,我們來看代碼就知道是怎么回事了。

1.先定義一個(gè)麻將的實(shí)體類:

static class Mahjong{
    int suit;   //花色 萬 筒 條
    int rank;   //點(diǎn)數(shù)大小

    public Mahjong(int suit,int rank){
        this.suit = suit;
        this.rank = rank;
    }
}

2.然后模擬一組麻將數(shù)據(jù):

  SinglyLinkedList<Mahjong> list = new SinglyLinkedList<>();  //使用單鏈表恍风,因?yàn)樾首罡?    list.add(new Mahjong(3,1));
    list.add(new Mahjong(2,3));
    list.add(new Mahjong(3,7));
    list.add(new Mahjong(1,1));
    list.add(new Mahjong(3,8));
    list.add(new Mahjong(2,2));
    list.add(new Mahjong(3,2));
    list.add(new Mahjong(1,3));
    list.add(new Mahjong(3,9));

    radixSort(list);

這里就不打印了蹦狂,有興趣的同志可以自己參照思路進(jìn)行實(shí)現(xiàn)。

3.然后對麻將集合進(jìn)行鏈?zhǔn)交鶖?shù)排序

  public static void radixSort(SinglyLinkedList<Mahjong> list){
    //step1:先初始化要存放點(diǎn)數(shù)的集合數(shù)組
    SinglyLinkedList[] rankList = new SinglyLinkedList[9];

    for(int i=0;i<rankList.length;i++){
        rankList[i] = new SinglyLinkedList();  //讓每個(gè)數(shù)組都放置單鏈表集合
    }

    //step2: 根據(jù)點(diǎn)數(shù)把數(shù)據(jù)放入對應(yīng)的組中 把點(diǎn)數(shù)為1放入數(shù)組0, 2的放入1......
    while (list.size() > 0){
        Mahjong mahjong = list.remove();    //注意這里是把數(shù)據(jù)進(jìn)行刪除朋贬,也可以用get方法凯楔,為了方便下面我直接用的刪除
        rankList[mahjong.rank - 1].add(mahjong);    //麻將的點(diǎn)數(shù)-1就是放入對應(yīng)的數(shù)組下標(biāo),因?yàn)槁閷⑹菑?開始的
    }

    //step3:把9個(gè)組的數(shù)據(jù)連接起來形成一個(gè)單鏈表锦募,這里就用原來的list進(jìn)行存儲(chǔ)摆屯,因?yàn)樯厦嬉呀?jīng)取空了
    for(int i=0;i<rankList.length;i++){
        list.addAll(rankList[i]);
    }

    //step4:初始化要存放花色的集合數(shù)組,這個(gè)邏輯和上面存放點(diǎn)數(shù)的是一樣的
    SinglyLinkedList[] suitList = new SinglyLinkedList[3];
    for (int i=0;i<suitList.length;i++){
        suitList[i] = new SinglyLinkedList();
    }

    //step5:根據(jù)花色把數(shù)據(jù)放入對應(yīng)的組中御滩,花色為1放入0.鸥拧。。削解。富弦。。
    while (list.size() > 0){
        Mahjong mahjong = list.remove();
        suitList[mahjong.suit - 1].add(mahjong);
    }

    //step6:把3個(gè)組的數(shù)據(jù)連接起來形成一個(gè)單鏈表氛驮,最后list存放的就是我們排好點(diǎn)數(shù)和花色的數(shù)據(jù)
    for(int i=0;i<suitList.length;i++){
        list.addAll(suitList[i]);
    }
}

鏈?zhǔn)交鶖?shù)排序的應(yīng)用場景:斗地主紙牌游戲腕柜,麻將初始化的排序,不適用于在打麻將過程中摸一張打一張的排序。

小白總結(jié)盏缤,往大神指點(diǎn)砰蠢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唉铜,隨后出現(xiàn)的幾起案子台舱,更是在濱河造成了極大的恐慌,老刑警劉巖潭流,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竞惋,死亡現(xiàn)場離奇詭異,居然都是意外死亡灰嫉,警方通過查閱死者的電腦和手機(jī)拆宛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讼撒,“玉大人浑厚,你說我怎么就攤上這事「校” “怎么了钳幅?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郑象。 經(jīng)常有香客問我贡这,道長茬末,這世上最難降的妖魔是什么厂榛? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮丽惭,結(jié)果婚禮上击奶,老公的妹妹穿的比我還像新娘。我一直安慰自己责掏,他們只是感情好柜砾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著换衬,像睡著了一般痰驱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞳浦,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天担映,我揣著相機(jī)與錄音,去河邊找鬼叫潦。 笑死蝇完,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播短蜕,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼氢架,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了朋魔?” 一聲冷哼從身側(cè)響起岖研,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎警检,沒想到半個(gè)月后缎玫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡解滓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年赃磨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼裤。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邻辉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腮鞍,到底是詐尸還是另有隱情值骇,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布移国,位于F島的核電站吱瘩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏迹缀。R本人自食惡果不足惜使碾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祝懂。 院中可真熱鬧票摇,春花似錦、人聲如沸砚蓬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灰蛙。三九已至祟剔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摩梧,已是汗流浹背物延。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留障本,地道東北人教届。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓响鹃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親案训。 傳聞我的和親對象是個(gè)殘疾皇子买置,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序强霎,而外部排序是因排序的數(shù)據(jù)很大忿项,一次不能容納全部...
    蟻前閱讀 5,191評論 0 52
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序城舞,而外部排序是因排序的數(shù)據(jù)很大轩触,一次不能容納全部的...
    Luc_閱讀 2,278評論 0 35
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序家夺,而外部排序是因排序的數(shù)據(jù)很大脱柱,一次不能容納全部...
    閑云清煙閱讀 758評論 0 6
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序拉馋,而外部排序是因排序的數(shù)據(jù)很大榨为,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評論 0 15
  • 送一箱開襠褲讓女孩上街去迷男人,挨別人一耳光純屬活該煌茴。 寧昊只能自認(rèn)倒霉随闺。 這事怪不到白無常,只怪自己嘴欠蔓腐。 看來...
    可可豆子閱讀 327評論 0 5