算法學(xué)習(xí)03_歸并排序

基本思想

歸并排序是分而治之的算法思想的實(shí)際應(yīng)用翰灾,其排序過程是將待排序序列逐層分解直到最后只有一個(gè)元素稚茅,然后在反向合并。


遞歸版歸并排序

如上圖所示

  1. \{38,27,43,3,9,82,10\}被分解為\{38,27,43,3\}萎馅,\{9,82,10\}虹蒋。
  2. \{38,27,43,3\}被分解為\{38,27\}\{43,3\}
  3. \{38,27\}被分解為\{38\}峭竣,\{27\}晃虫,此時(shí)各組只有一個(gè)元素不再繼續(xù)分解。
  4. 合并\{38\}哲银,\{27\}\{27,38\}滥比。
  5. 分解\{43, 3\}\{43\}做院,\{3\},此時(shí)各組只有一個(gè)元素不再繼續(xù)分解寺滚。
  6. 合并\{43\}屈雄,\{3\}\{3, 43\}.
  7. 合并 4,6結(jié)果\{27,38\}酒奶,\{3, 43\}\{3, 27,38勒虾,43\}瘸彤。
  8. 分解\{9,82,10\}\{9,82,\},\{10\}
  9. 分解\{9,82,\}\{9\},\{82\}愕宋,此時(shí)各組只有一個(gè)元素不再繼續(xù)分解结榄。
  10. 合并\{9\},\{82\}\{9,82\}
  11. 合并\{9,82\},\{10\}\{9,10,82\}邻寿。
  12. 合并7,11結(jié)果\{3, 27视哑,38,43\}挡毅,\{9,10,82\}\{3, 9,10,27段磨,38, 43, 82\}排序結(jié)束耗绿。
    在整個(gè)排序過程中分解過程較為簡單,就是一分為二沐序,核心在合并過程堕绩,即將兩個(gè)有序序列合并為一個(gè)有序序列

源碼實(shí)現(xiàn)

遞歸版

    static void merge(T arr[], int size) {
        merge(arr, 0, size - 1);
    }
    static void merge(T arr[], int L, int R) {
        if (L >= R) {
         //  遞歸結(jié)束
            return;
        }
        int M = L + (R - L) / 2;
        merge(arr, L, M);
        merge(arr, M + 1, R);
        merge(arr, L, M, R);
    }
    static void merge(T arr[], int L, int M, int R) {

        T *aux = new T[R - L + 1];
        for (int i = L; i <= R; i++) {
            aux[i-L] = arr[i];
        }
        // i 索引歸并后的數(shù)組[L, R]奴紧,j索引aux左半邊數(shù)組[0,M-L],k索引aux
        // 右半邊[M-L+1, R-L]
        for (int i = L, j=0, k=M-L+1; i <= R; i++) {
            if (j > M-L) {
                arr[i] = aux[k++];
            }
            else if (k > R - L) {
                arr[i] = aux[j++];
            }
            else if (aux[j] > aux[k]) {
                arr[i] = aux[k++];
            }
            else {
                arr[i] = aux[j++];
            }
        }
        delete[]aux;
    }

迭代版

    static void merge_bu(T arr[], int size) {
        for (int sz = 1; sz < size; sz += sz) {
            for (int i = 0; i < size - sz; i+=sz*2) {
                merge(arr, i, i + sz - 1, size-1< i + 2 * sz - 1?size-1: i + 2 * sz - 1);
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黍氮,一起剝皮案震驚了整個(gè)濱河市浅浮,隨后出現(xiàn)的幾起案子捷枯,更是在濱河造成了極大的恐慌,老刑警劉巖郁油,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攀痊,死亡現(xiàn)場離奇詭異,居然都是意外死亡苟径,警方通過查閱死者的電腦和手機(jī)棘街,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遭殉,“玉大人,你說我怎么就攤上這事誊稚÷扌模” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵疾瓮,是天一觀的道長飒箭。 經(jīng)常有香客問我,道長弦蹂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任削祈,我火速辦了婚禮,結(jié)果婚禮上髓抑,老公的妹妹穿的比我還像新娘。我一直安慰自己褪猛,他們只是感情好羹饰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著严里,像睡著了一般追城。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迷帜,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天色洞,我揣著相機(jī)與錄音,去河邊找鬼火诸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奈搜,可吹牛的內(nèi)容都是我干的盯荤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼宏粤,長吁一口氣:“原來是場噩夢啊……” “哼灼卢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞋真,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赶袄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饿肺,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敬辣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溉跃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嵌牺,死狀恐怖龄糊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炫惩,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布蹋绽,位于F島的核電站筋蓖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扭勉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一忠聚、第九天 我趴在偏房一處隱蔽的房頂上張望唱捣。 院中可真熱鬧,春花似錦震缭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膛堤。三九已至,卻和暖如春绿渣,著一層夾襖步出監(jiān)牢的瞬間燕耿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工誉帅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吧凉。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓踏志,卻偏偏與公主長得像胀瞪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子凄诞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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

  • 概述 排序有內(nèi)部排序和外部排序帆谍,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大汛蝙,一次不能容納全部...
    蟻前閱讀 5,170評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序坚洽,而外部排序是因排序的數(shù)據(jù)很大西土,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評論 0 15
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大般甲,一次不能容納全部的...
    Luc_閱讀 2,259評論 0 35
  • 概述 排序有內(nèi)部排序和外部排序鹅颊,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大挪略,一次不能容納全部...
    閑云清煙閱讀 756評論 0 6
  • 壺觴傾覆留夷蕊杠娱,泠露庭柯鴻雁飛挽牢。 半攬長鋏傷流景摊求,煙云幾縷醉扶歸。 注:新韻室叉,首句平起不入韻。 1茧痕、留夷, 基本意...
    幽小窗閱讀 757評論 38 58