歸并排序算法

基本思想

歸并排序采用的是分治算法的思想,其中最重要的操作就是歸并操作哮奇。

主要思想是膛腐,將數(shù)組平分為A睛约,B兩部分,分別將A,B兩部分排好序哲身,然后再合并辩涝,對A排序的時候,也是同樣的思路勘天,將A分為兩份怔揩,同樣先分別排序,再合并脯丝。一直遞歸下去商膊,直到不能再分解為止。

網(wǎng)上看到一張圖很好的解釋了這個過程:

歸并算法過程.png

再用動畫展示一下這個過程:


歸并過程動畫.gif

歸并過程

假設(shè)數(shù)組已經(jīng)被分解成了兩個有序的數(shù)組宠进,這個時候就應(yīng)該將這兩個有序數(shù)組合并成一個新的有序數(shù)組晕拆。這個時候需要額外的存儲空間來輔助這個歸并過程(所以歸并排序不是原地排序)。

下面來張圖展示這個過程:

歸并過程.png

代碼實(shí)現(xiàn)--遞歸版

#include <iostream>
using namespace std;

template<typename T>
void mergeSort(T arr[], int n){
    // 一次性申請aux空間,
    // 并將這個輔助空間以參數(shù)形式傳遞給完成歸并排序的各個子函數(shù)
    T *aux = new T[n];

    __mergeSort( arr , aux, 0 , n-1 );

    delete[] aux;   // 使用C++, new出來的空間不要忘記釋放掉:)
}

// 使用優(yōu)化的歸并排序算法, 對arr[l...r]的范圍進(jìn)行排序
// 其中aux為完成merge過程所需要的輔助空間
template<typename T>
void __mergeSort(T arr[], T aux[], int l, int r){
    // 遞歸的終點(diǎn) 數(shù)組只剩一個元素的時候就可以停止了
    if( l >= r ){
        return;
    }

    int mid = l + (r-l)/2;
    __mergeSort(arr, aux, l, mid);
    __mergeSort(arr, aux, mid+1, r);
    __merge(arr, aux, l, mid, r);
}

// 將arr[l...mid]和arr[mid+1...r]兩部分進(jìn)行歸并
// 其中aux為完成merge過程所需要的輔助空間
template<typename  T>
void __merge(T arr[], T aux[], int l, int mid, int r){
    // 將原數(shù)組的數(shù)據(jù)復(fù)制給aux
    for( int i = l ; i <= r; i ++ )
        aux[i] = arr[i];

    // 初始化材蹬,i指向左半部分的起始索引位置l实幕;j指向右半部分起始索引位置mid+1
    int i = l, j = mid+1;
    for( int k = l ; k <= r; k ++ ){
        if( i > mid ){  // 如果左半部分元素已經(jīng)全部處理完畢
            arr[k] = aux[j]; j ++;
        }
        else if( j > r ){  // 如果右半部分元素已經(jīng)全部處理完畢
            arr[k] = aux[i]; i ++;
        }
        else if( aux[i] < aux[j] ) {  // 左半部分所指元素 < 右半部分所指元素
            arr[k] = aux[i]; i ++;
        }
        else{  // 左半部分所指元素 >= 右半部分所指元素
            arr[k] = aux[j]; j ++;
        }
    }
}

結(jié)論

歸并排序總的平均時間復(fù)雜度為O(nlogn),最好赚导,最壞茬缩,平均時間復(fù)雜度均為O(nlogn)。所以歸并排序是穩(wěn)定的排序算法吼旧,缺點(diǎn)是需要額外的存儲空間(貌似也有原地歸并排序凰锡,無需額外存儲空間,待研究)圈暗。

我的segmentfault鏈接

參考

  1. 圖解排序算法(四)之歸并排序
  2. 慕課網(wǎng)算法與數(shù)據(jù)結(jié)構(gòu)課程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掂为,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子员串,更是在濱河造成了極大的恐慌勇哗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸齐,死亡現(xiàn)場離奇詭異欲诺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渺鹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門扰法,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毅厚,你說我怎么就攤上這事塞颁。” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵祠锣,是天一觀的道長酷窥。 經(jīng)常有香客問我,道長伴网,這世上最難降的妖魔是什么蓬推? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮澡腾,結(jié)果婚禮上拳氢,老公的妹妹穿的比我還像新娘。我一直安慰自己蛋铆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布放接。 她就那樣靜靜地躺著刺啦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纠脾。 梳的紋絲不亂的頭發(fā)上玛瘸,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音苟蹈,去河邊找鬼糊渊。 笑死,一個胖子當(dāng)著我的面吹牛慧脱,可吹牛的內(nèi)容都是我干的渺绒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菱鸥,長吁一口氣:“原來是場噩夢啊……” “哼宗兼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氮采,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤殷绍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鹊漠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體主到,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年躯概,在試婚紗的時候發(fā)現(xiàn)自己被綠了登钥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楞陷,死狀恐怖怔鳖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤结执,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布度陆,位于F島的核電站,受9級特大地震影響献幔,放射性物質(zhì)發(fā)生泄漏懂傀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一蜡感、第九天 我趴在偏房一處隱蔽的房頂上張望蹬蚁。 院中可真熱鬧,春花似錦郑兴、人聲如沸犀斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叽粹。三九已至,卻和暖如春却舀,著一層夾襖步出監(jiān)牢的瞬間虫几,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工挽拔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辆脸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓螃诅,卻偏偏與公主長得像啡氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子州刽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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

  • 概述 排序有內(nèi)部排序和外部排序空执,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大穗椅,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序辨绊,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大匹表,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 1 初級排序算法 排序算法關(guān)注的主要是重新排列數(shù)組元素门坷,其中每個元素都有一個主鍵。排序算法是將所有元素主鍵按某種方...
    深度沉迷學(xué)習(xí)閱讀 1,408評論 0 1
  • 歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(分治法將問題分(d...
    安然若知閱讀 1,101評論 0 0
  • 《芳華》和年代無關(guān)袍镀,我們都是他們之間的一員默蚌。即使是今天,在一個集體里苇羡,都會找到電影里的原型绸吸。有人是活雷鋒,認(rèn)吃虧,...
    蘇蘇菲兒閱讀 225評論 0 0