iOS - 基數(shù)排序

Demo_github

圖片源于網(wǎng)絡

基數(shù)排序

基數(shù)排序(Radix Sort)是根據(jù)關鍵字中各位的值,通過對排序的N個元素進行若干趟“分配”與“收集”來實現(xiàn)排序的腺阳。

算法思想

  • 基于LSD方法的鏈式基數(shù)排序的基本思想

    “多關鍵字排序”的思想實現(xiàn)“單關鍵字排序”。對數(shù)字型或字符型的單關鍵字盖溺,可以看作由多個數(shù)位或多個字符構成的多關鍵字遇革,此時可以采用“分配-收集”的方法進行排序沉噩,這一過程稱作基數(shù)排序法吏祸,其中每個數(shù)字或字符可能的取值個數(shù)稱為基數(shù)对蒲。比如,撲克牌的花色基數(shù)為4贡翘,面值基數(shù)為13蹈矮。在整理撲克牌時,既可以先按花色整理床估,也可以先按面值整理。按花色整理時诱渤,先按紅丐巫、黑、方勺美、花的順序分成4摞(分配)递胧,再按此順序再疊放在一起(收集),然后按面值的順序分成13摞(分配)赡茸,再按此順序疊放在一起(收集)缎脾,如此進行二次分配和收集即可將撲克牌排列有序。

  • 基數(shù)排序?qū)崿F(xiàn)步驟
    • 判斷數(shù)據(jù)在各位的大小占卧,排列數(shù)據(jù)

    • 根據(jù)上一步的結果遗菠,判斷數(shù)據(jù)在十分位的大小联喘,排列數(shù)據(jù)。如果數(shù)據(jù)在這個位置的余數(shù)相同辙纬,那么數(shù)據(jù)之間的順序根據(jù)上一輪的排列順序確定

    • 依次類推豁遭,繼續(xù)判斷數(shù)據(jù)在百分位、千分位......上面的數(shù)據(jù)重新排序贺拣,直到所有的數(shù)據(jù)在某一分位上數(shù)據(jù)都為0

  • 基數(shù)排序?qū)崿F(xiàn)步驟實例

    假設有欲排數(shù)據(jù)序列如下所示:

    73 22 93 43 55 14 28 65 39 81

    首先根據(jù)個位數(shù)的數(shù)值蓖谢,在遍歷數(shù)據(jù)時將它們各自分配到編號0至9的桶(個位數(shù)值與桶號一一對應)中。

    分配結果

    分配結束后譬涡。接下來將所有桶中所盛數(shù)據(jù)按照桶號由小到大(桶中由頂至底)依次重新收集串起來闪幽,得到如下仍然無序的數(shù)據(jù)序列:

    81 22 73 93 43 14 55 65 28 39

    接著,再進行一次分配涡匀,這次根據(jù)十位數(shù)值來分配(原理同上)

    分配結果

    分配結束后盯腌。接下來再將所有桶中所盛的數(shù)據(jù)(原理同上)依次重新收集串接起來,得到如下的數(shù)據(jù)序列:

    14 22 28 39 43 55 65 73 81 93

    觀察可以看到渊跋,此時原無序數(shù)據(jù)序列已經(jīng)排序完畢腊嗡。如果排序的數(shù)據(jù)序列有三位數(shù)以上的數(shù)據(jù),則重復進行以上的動作直至最高位數(shù)為止拾酝。

代碼范例:
#pragma mark --- 基數(shù)排序
/**
 基數(shù)排序
 
 @param array 需要排序的Array
 */
+ (void)radixSort:(NSMutableArray *)array
{
    /**
     基于LSD方法的鏈式基數(shù)排序的基本思想
       “多關鍵字排序”的思想實現(xiàn)“單關鍵字排序”燕少。對數(shù)字型或字符型的單關鍵字,可以看作由多個數(shù)位或多個字符構成的多關鍵字蒿囤,此時可以采用“分配-收集”的方法進行排序客们,這一過程稱作基數(shù)排序法,其中每個數(shù)字或字符可能的取值個數(shù)稱為基數(shù)材诽。比如底挫,撲克牌的花色基數(shù)為4,面值基數(shù)為13脸侥。在整理撲克牌時建邓,既可以先按花色整理,也可以先按面值整理睁枕。按花色整理時官边,先按紅、黑外遇、方注簿、花的順序分成4摞(分配),再按此順序再疊放在一起(收集)跳仿,然后按面值的順序分成13摞(分配)诡渴,再按此順序疊放在一起(收集),如此進行二次分配和收集即可將撲克牌排列有序菲语。
     基數(shù)排序:
     是按照低位先排序妄辩,然后收集惑灵;再按照高位排序,然后再收集恩袱;依次類推泣棋,直到最高位。有時候有些屬性是有優(yōu)先級順序的畔塔,先按低優(yōu)先級排序潭辈,再按高優(yōu)先級排序。最后的次序就是高優(yōu)先級高的在前澈吨,高優(yōu)先級相同的低優(yōu)先級高的在前把敢。基數(shù)排序基于分別排序谅辣,分別收集修赞,所以是穩(wěn)定的。
     */
    //創(chuàng)建空桶
    NSMutableArray *buckt = [self createBucket];
    //待排數(shù)組的最大數(shù)值
    NSNumber *maxnumber = [self listMaxItem:array];
    //最大數(shù)值的數(shù)字位數(shù)
    NSInteger maxLength = numberLength(maxnumber);
    // 按照從低位到高位的順序執(zhí)行排序過程
    for (int digit = 1; digit <= maxLength; digit++) {
        // 入桶
        for (NSNumber *item in array) {
            //確定item 歸屬哪個桶 以digit位數(shù)為基數(shù)
            NSInteger baseNumber = [self fetchBaseNumber:item digit:digit];
            NSMutableArray *mutArray = buckt[baseNumber];
            //將數(shù)據(jù)放入空桶上
            [mutArray addObject:item];
        }
        NSInteger index = 0;
        //出桶
        for (int i = 0; i < buckt.count; i++) {
            NSMutableArray *array = buckt[i];
            //將桶的數(shù)據(jù)放回待排數(shù)組中
            while (array.count != 0) {
                
                NSNumber *number = [array objectAtIndex:0];
                array[index] = number;
                [array removeObjectAtIndex:0];
                index++;
            }
        }
    }
    NSLog(@"基數(shù)升序排序結果:%@", array);
}
//創(chuàng)建空桶
+ (NSMutableArray *)createBucket {
    NSMutableArray *bucket = [NSMutableArray array];
    for (int index = 0; index < 10; index++) {
        NSMutableArray *array = [NSMutableArray array];
        [bucket addObject:array];
    }
    return bucket;
}
//數(shù)據(jù)最大值
+ (NSNumber *)listMaxItem:(NSArray *)list {
    NSNumber *maxNumber = list[0];
    for (NSNumber *number in list) {
        if ([maxNumber integerValue] < [number integerValue]) {
            maxNumber = number;
        }
    }
    return maxNumber;
}
//數(shù)字的位數(shù)
NSInteger numberLength(NSNumber *number) {
    NSString *string = [NSString stringWithFormat:@"%ld", (long)[number integerValue]];
    return string.length;
}
+ (NSInteger)fetchBaseNumber:(NSNumber *)number digit:(NSInteger)digit {
    //digit為基數(shù)位數(shù)
    if (digit > 0 && digit <= numberLength(number)) {
        NSMutableArray *numbersArray = [NSMutableArray array];
        //        number的位數(shù)確定
        NSString *string = [NSString stringWithFormat:@"%ld", [number integerValue]];
        for (int index = 0; index < numberLength(number); index++) {
            [numbersArray addObject:[string substringWithRange:NSMakeRange(index, 1)]];
        }
        //        number的位數(shù) 是幾位數(shù)的
        NSString *str = numbersArray[numbersArray.count - digit];
        return [str integerValue];
    }
    return 0;
}

算法分析

基數(shù)排序的性能
基數(shù)排序的性能
時間復雜度

假設在基數(shù)排序中桑阶,r為基數(shù)柏副,d為位數(shù)。則基數(shù)排序的時間復雜度為O(d(n+r))蚣录。我們可以看出割择,基數(shù)排序的效率和初始序列是否有序沒有關聯(lián)。

空間復雜度

在基數(shù)排序過程中萎河,對于任何位數(shù)上的基數(shù)進行“裝桶”操作時荔泳,都需要n+r個臨時空間。

算法穩(wěn)定性

是按照低位先排序虐杯,然后收集玛歌;再按照高位排序,然后再收集擎椰;依次類推支子,直到最高位。有時候有些屬性是有優(yōu)先級順序的达舒,先按低優(yōu)先級排序值朋,再按高優(yōu)先級排序。最后的次序就是高優(yōu)先級高的在前休弃,高優(yōu)先級相同的低優(yōu)先級高的在前吞歼∪Ω啵基數(shù)排序基于分別排序塔猾,分別收集,所以是穩(wěn)定的稽坤。

參考

排序八 基數(shù)排序

基數(shù)排序

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丈甸,一起剝皮案震驚了整個濱河市糯俗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睦擂,老刑警劉巖得湘,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顿仇,居然都是意外死亡淘正,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門臼闻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸿吆,“玉大人,你說我怎么就攤上這事述呐〕痛荆” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵乓搬,是天一觀的道長思犁。 經(jīng)常有香客問我,道長进肯,這世上最難降的妖魔是什么激蹲? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坷澡,結果婚禮上托呕,老公的妹妹穿的比我還像新娘。我一直安慰自己频敛,他們只是感情好项郊,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斟赚,像睡著了一般着降。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拗军,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天任洞,我揣著相機與錄音,去河邊找鬼发侵。 笑死交掏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的刃鳄。 我是一名探鬼主播盅弛,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挪鹏?” 一聲冷哼從身側響起见秽,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讨盒,沒想到半個月后解取,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡返顺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年禀苦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遂鹊。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡伦忠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稿辙,到底是詐尸還是另有隱情昆码,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布邻储,位于F島的核電站赋咽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吨娜。R本人自食惡果不足惜脓匿,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宦赠。 院中可真熱鬧陪毡,春花似錦、人聲如沸勾扭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妙色。三九已至桅滋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間身辨,已是汗流浹背丐谋。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煌珊,地道東北人号俐。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像定庵,于是被迫代替她去往敵國和親吏饿。 傳聞我的和親對象是個殘疾皇子践美,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序找岖,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,186評論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,258評論 0 2
  • 概述 排序有內(nèi)部排序和外部排序敛滋,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序许布,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    閑云清煙閱讀 758評論 0 6
  • 風吹過绎晃,你那溫情含笑的目光還在蜜唾,雨落下,每一滴雨珠似乎都記錄著你說過的每一句話庶艾,翻開書袁余,讀過的故事中怎會都有你的影...
    心芳菲閱讀 177評論 0 0
  • 類似 nowa init modnowa init page 使用命令: rok init -e=${Entity...
    光劍書架上的書閱讀 610評論 0 0