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

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法镀赌,該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列玛追;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表叮贩,稱為二路歸并说莫。

歸并過程為:比較a[i]和b[j]的大小,若a[i]≤b[j]储狭,則將第一個(gè)有序表中的元素a[i]復(fù)制到r[k]中互婿,并令i和k分別加上1;否則將第二個(gè)有序表中的元素b[j]復(fù)制到r[k]中辽狈,并令j和k分別加上1慈参,如此循環(huán)下去,直到其中一個(gè)有序表取完刮萌,然后再將另一個(gè)有序表中剩余的元素復(fù)制到r中從下標(biāo)k到下標(biāo)t的單元驮配。

歸并排序通常用遞歸實(shí)現(xiàn),先把待排序區(qū)間[s,t]以中點(diǎn)二分掰邢,接著把左邊子區(qū)間排序娃承,再把右邊子區(qū)間排序麻削,最后把左區(qū)間和右區(qū)間用一次歸并操作合并成有序的區(qū)間[s,t]。

值得注意的是苏揣,歸并排序的速度僅次于快速排序弟跑,但卻是穩(wěn)定排序炭玫。

代碼一:

//將r[i…m]和r[m +1 …n]歸并到輔助數(shù)組rf[i…n]
void Merge(int *r,int *rf, int i, int m, int n)
{
    int j,k;
    for(j=i,k=m+1; j<=m && k<=n ; ++k)
    {
        if(r[j] < r[i])
            rf[k] = r[j++];
        else
            rf[k] = r[i++];
    }
    while(i <= m) {
        rf[k++] = r[i++];
    }
    while(j <= n) {
        rf[k++] = r[j++];
    }
}

void MergeSort1(int *r, int *rf, int lenght)
{
    int len = 1;
    int *q = r ;
    int *tmp ;
    while(len < lenght) {
        int s = len;
        len = 2 * s ;
        int i = 0;
        while(i+ len <lenght){
            Merge(q, rf,  i, i+ s-1, i+len-1 ); //對(duì)等長的兩個(gè)子表合并
            i = i+ len;
        }
        if(i + s < lenght){
            Merge(q, rf,  i, i+ s-1, lenght -1); //對(duì)不等長的兩個(gè)子表合并
        }
        tmp = q; q = rf; rf = tmp; //交換q,rf码党,以保證下一趟歸并時(shí),仍從q 歸并到rf
        //len = 2 * s ;
    }
}

代碼二:

//將有二個(gè)有序數(shù)列a[first...mid]和a[mid...last]合并。
void MergeArray(int a[], int first, int mid, int last, int temp[])
{
    int i = first, j = mid + 1;
    int m = mid,   n = last;
    int k = 0;
    while (i <= m && j <= n)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while (i <= m)
        temp[k++] = a[i++];

    while (j <= n)
        temp[k++] = a[j++];

    for (i = 0; i < k; i++)
        a[first + i] = temp[i];
}
void MergeSort2(int a[], int first, int last, int temp[])
{
    if (first < last)
    {
        int mid = (first + last) / 2;

        //左邊有序
        MergeSort2(a, first, mid, temp); 

        //右邊有序
        MergeSort2(a, mid + 1, last, temp); 

        //再將二個(gè)有序數(shù)列合并
        MergeArray(a, first, mid, last, temp); 
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市靴跛,隨后出現(xiàn)的幾起案子挤牛,更是在濱河造成了極大的恐慌,老刑警劉巖梁厉,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碱妆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)混移,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氨鹏,“玉大人欧募,你說我怎么就攤上這事∮骼纾” “怎么了槽片?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵何缓,是天一觀的道長。 經(jīng)常有香客問我还栓,道長碌廓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任剩盒,我火速辦了婚禮谷婆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辽聊。我一直安慰自己纪挎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布跟匆。 她就那樣靜靜地躺著,像睡著了一般玛臂。 火紅的嫁衣襯著肌膚如雪烤蜕。 梳的紋絲不亂的頭發(fā)上迹冤,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音泡徙,去河邊找鬼橱鹏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堪藐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庶橱,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苏章!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起奏瞬,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤枫绅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后并淋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珍昨,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句喷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年兔毙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唾琼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澎剥。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哑姚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叙量,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布寺鸥,位于F島的核電站,受9級(jí)特大地震影響析既,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眼坏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一酸些、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魄懂,春花似錦、人聲如沸市栗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至篡腌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘹悼,已是汗流浹背层宫。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工其监, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棠赛。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像睛约,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辩涝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,253評(píng)論 0 2
  • 概述 排序有內(nèi)部排序和外部排序怔揩,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序捉邢,而外部排序是因排序的數(shù)據(jù)很大商膊,一次不能容納全部...
    蟻前閱讀 5,183評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序晕拆,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評(píng)論 0 15
  • 概述排序有內(nèi)部排序和外部排序吝镣,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大末贾,一次不能容納全部的...
    Luc_閱讀 2,270評(píng)論 0 35
  • 總結(jié)一下常見的排序算法整吆。 排序分內(nèi)排序和外排序拱撵。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序表蝙。外排序:指在排序...
    jiangliang閱讀 1,342評(píng)論 0 1