有趣的桶排序

程序員的核心技能之一就是算法,談到算法砾省,似乎都是從排序開始混槐。對(duì)一組已知范圍的數(shù)據(jù)進(jìn)行排序,最快的算法是什么呢声登?快速排序?希爾排序件舵?非也脯厨,非也~是本文的主角“桶排序”!
  來看一個(gè)實(shí)際例子吧:已知一組范圍在0~10的數(shù)據(jù)(如:9,5,2,7,7),你有沒有什么好方法編寫一段程序俄认,將數(shù)據(jù)從大到小輸出呢?
  看到這樣的題目,相信很多人第一反應(yīng)跟我一樣壳澳,就是將這些數(shù)據(jù)進(jìn)行比較,然后進(jìn)行位置的交換萎津,最終實(shí)現(xiàn)排序抹镊。可桶排序徹底顛覆了這種想法——第一次看到桶排序時(shí)垮耳,確實(shí)被驚艷到了——還有這種操作遂黍?俊嗽!原來排序不一定非得老老實(shí)實(shí)對(duì)原有數(shù)據(jù)進(jìn)行位置調(diào)整绍豁!
  好了,回到我們的題目竹揍。我們只需要借助一個(gè)一維數(shù)組就可以解決問題。首先驶拱,我們申請(qǐng)一個(gè)長(zhǎng)度為11的數(shù)組int a[11],因?yàn)槲覀兊臄?shù)據(jù)范圍是0~10晶衷,而int a[11]的元素正好是a[0]~a[10]。開始的時(shí)候晌纫,我們將所有元素都初始化為0,表示這些數(shù)都未出現(xiàn)過箭养。例如a[0]等于0哥牍,就表示待排序數(shù)據(jù)還未出現(xiàn)過0;同理嗅辣,若a[9]等于1,則表示待排數(shù)據(jù)中9出現(xiàn)過1次澡谭。
  有了上面的說明,那接下來就非常簡(jiǎn)單了蛙奖,我們只需要遍歷待排數(shù)組,然后將每個(gè)數(shù)值對(duì)應(yīng)下標(biāo)的元素加1(比如第一個(gè)數(shù)是9雁仲,我們就將a[9]加1)。你會(huì)發(fā)現(xiàn)缸兔,待排數(shù)組遍歷完之后,a[0]~a[10]中的數(shù)值灶体,其實(shí)就是0~10出現(xiàn)的次數(shù),我們只需要按次數(shù)將下標(biāo)打印出來就實(shí)現(xiàn)排序了政钟。代碼如下:

#include <stdio.h>
int main()
{
    int a[11],i,j,t;
    for(i=10; i>=0; i--)
    {
        a[i]=0;
    }

    for(i=1; i<=5; i++) //循環(huán)讀入5個(gè)待排數(shù)
    {
        scanf("%d",&t); //把每一個(gè)數(shù)讀到變量t中
        a[t]++; //進(jìn)行計(jì)數(shù)
    }

    for(i=10; i>=0; i--)
    {
        for(j=1; j<=a[i];j++)
        {
            printf("%d ",i);
        }
    }

    printf("\r\n"); 
    getchar();  
    return 0;
}

執(zhí)行該程序樟结,我們可以隨意輸入5個(gè)0~10的數(shù)字,然后程序會(huì)將其按從大到小排序輸出碎连,如下圖:

圖1

  接下來我們來看看時(shí)間復(fù)雜度驮履。首先我們用了一個(gè)m次(m為桶的個(gè)數(shù))的循環(huán)把桶清空;然后再用一個(gè)n次(n為待排序數(shù)據(jù)的個(gè)數(shù))的循環(huán),設(shè)置的數(shù)據(jù)的顯示次數(shù);最后又進(jìn)行了m+n次循環(huán)倒戏,把數(shù)據(jù)顯示出來恐似。所以,整個(gè)排序算法一共執(zhí)行了m+n+m+n次葛闷。我們用大寫字母O來表示時(shí)間復(fù)雜度双藕,因此該算法的時(shí)間復(fù)雜度是O(m+n+m+n)即O(2*(m+n))。我們?cè)谡f時(shí)間復(fù)雜度的時(shí)候可以忽略較小的常數(shù)蔓彩,最終桶排序的時(shí)間復(fù)雜度為O(m+n)。還有一點(diǎn),在表示時(shí)間復(fù)雜度的時(shí)候顺又,n和m通常用大寫字母即O(M+N),這是一個(gè)非常快的排序算法蹂空。
  桶排序雖快,但其實(shí)它是用空間在換時(shí)間上枕。如果需要排序的數(shù)范圍非常寬,那我們就需要申請(qǐng)非常多的“桶”來存儲(chǔ)每一個(gè)數(shù)出現(xiàn)的次數(shù)棋恼。即使依然只是需要對(duì)5個(gè)數(shù)進(jìn)行排序锈玉,這太浪費(fèi)空間了!所以在選擇使用哪種排序算法之前师崎,還是需要根據(jù)實(shí)際情況椅棺,權(quán)衡好復(fù)雜度與空間的問題。

參考書籍:《啊哈两疚!算法》
說明:本文所提到的是簡(jiǎn)化版的桶排序算法,真正的同排序算法要復(fù)雜些顷窒,有興趣的朋友可以自行搜索學(xué)習(xí)源哩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谓着,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坛掠,老刑警劉巖赊锚,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舷蒲,死亡現(xiàn)場(chǎng)離奇詭異友多,居然都是意外死亡牲平,警方通過查閱死者的電腦和手機(jī)域滥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昂儒,“玉大人,你說我怎么就攤上這事腊嗡∩餐鳎” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵棺亭,是天一觀的道長(zhǎng)蟋软。 經(jīng)常有香客問我,道長(zhǎng)岳守,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任涝缝,我火速辦了婚禮譬重,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滩援。我一直安慰自己塔嬉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布恩袱。 她就那樣靜靜地躺著胶哲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纪吮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天棚辽,我揣著相機(jī)與錄音冰肴,去河邊找鬼。 笑死联逻,一個(gè)胖子當(dāng)著我的面吹牛检痰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铅歼,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼椎椰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了慨飘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤休弃,失蹤者是張志新(化名)和其女友劉穎堤瘤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桥帆,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慎皱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年茫多,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跪帝,死狀恐怖些阅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情市埋,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布抒倚,位于F島的核電站坷澡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镣陕。R本人自食惡果不足惜姻政,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹊碍。 院中可真熱鬧食绿,春花似錦侈咕、人聲如沸器紧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掌腰。三九已至,卻和暖如春齿梁,著一層夾襖步出監(jiān)牢的瞬間肮蛹,已是汗流浹背创南。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工扰藕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人邓深。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓芥备,卻偏偏與公主長(zhǎng)得像舌菜,于是被迫代替她去往敵國和親萌壳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子日月,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理爱咬,服務(wù)發(fā)現(xiàn),斷路器精拟,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 數(shù)據(jù)結(jié)構(gòu)與算法——計(jì)數(shù)排序洗贰、桶排序、基數(shù)排序 計(jì)數(shù)排序 計(jì)數(shù)排序有如下四個(gè)步驟拨脉。 首先會(huì)對(duì)每個(gè)輸入進(jìn)行頻率統(tǒng)計(jì),得...
    sunhaiyu閱讀 1,119評(píng)論 0 11
  • 某次二面時(shí)矛缨,面試官問起Js排序問題,吾絞盡腦汁回答了幾種箕昭,深感算法有很大的問題,所以總計(jì)一下落竹! 排序算法說明 (1...
    流浪的先知閱讀 1,194評(píng)論 0 4
  • 概述:排序有內(nèi)部排序和外部排序述召,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大积暖,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評(píng)論 0 15
  • 一場(chǎng)放逐心靈的救贖 靜下心來認(rèn)認(rèn)真真地寫份東西,還是很珍惜這種踏實(shí)安心的感覺缅疟。 《肖申克的救贖》(《TheShaw...
    Mon阿修閱讀 314評(píng)論 0 1