分冶法之合并排序

2017/2/26 使用模板改寫鼠渺,不支持char(char的結(jié)束符需要額外的改變)

合并排序的思想

對(duì)于一個(gè)需要排序的數(shù)組A[0n-1]勋颖,合并排序?qū)⑺环譃槎篈[0[n/2]-1],A[[n/2]~n-1],并對(duì)每一個(gè)子數(shù)組遞歸排序,然后把這兩個(gè)排好序的子數(shù)組合并為一個(gè)有序數(shù)組

偽代碼

  1. MergeSort,將數(shù)組遞歸拆分并使用Merge排序
      MergeSort(A[0~n-1])
    //遞歸調(diào)用mergesort對(duì)數(shù)組A[0~n-1]排序
    //輸入:一個(gè)可排序數(shù)組A[0~n-1]
    //輸出:非降序排列的數(shù)組A[0~n-1]
      if(n>1)
        copy A[0~[n/2]-1] to B[0~[n/2]-1]
        copy A[[n/2]~n-1] to C[0~[(n+1)/2]-1]//向上取整,請(qǐng)思考n為奇數(shù)的情況
        MergeSort(B[0~[n/2]-1])
        MergeSort(C[0~[(n+1)/2]-1])
        Merge(B,C,A)
    ```
2. Merge,真正實(shí)現(xiàn)排序的函數(shù)

Merge(B[0~p-1],C[0~q-1],A[0~p+q-1])
將兩個(gè)有序數(shù)組合并為一個(gè)有序數(shù)組
//輸入:兩個(gè)有序數(shù)組B[0~p-1],C[0~q-1]
//輸出:A[0~p+q-1]已經(jīng)有序存放B和C中的元素
i=0,j=0,k=0;
while i<p and j<q do
    if B[i]<=C[j]
        A[k]=B[i];i++;
    else
        A[k]=C[j];j++;
    k++;

if i==p
    copy C[j~q-1] to A[k~p+q-1]
else
    copy B[i~q-1] to A[k~p+q-1]
#### 分析
1. MergeSort可以結(jié)合下圖理解并思考n=2時(shí)的情況
![MergeSort](http://upload-images.jianshu.io/upload_images/2400535-83ceb26984c6ebac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2. Merge很好理解,因?yàn)锽粪摘,C都是有序數(shù)組瀑晒,從B,C的下標(biāo)i=0,j=0開始徘意,找出兩個(gè)中較小的一個(gè)苔悦,加入到A,并移動(dòng)相應(yīng)的i或j到下一位置映砖,如果其中一個(gè)數(shù)組已經(jīng)計(jì)算完畢间坐,將另一個(gè)數(shù)組的剩余元素直接復(fù)制到A的尾部。


#### 代碼
```c++
#include <iostream>
using namespace std;
void Merge(int *B, int p, int *C, int q, int *A);
void MergeSort(int *A, const int n);

int main()
{
    const int n = 8;
    int A[n] = {2,5,7,4,3,1,8,9};
    MergeSort(A, n);
    for (int i = 0; i < n; i++)
        cout << A[i] << "\t";

    system("pause");
    return 0;
}
void MergeSort(int *A, const int n)
{
    if (n>1)
    {
        int nB = n / 2;//向下取正
        int nC = (n + 1) / 2;//取上取整
        int *B = new int[nB];
        int *C = new int[nC];
        memcpy(B, A, nB * sizeof(int));
        memcpy(C, A + nB, nC * sizeof(int));
        MergeSort(B, nB);
        MergeSort(C, nC);
        Merge(B, nB, C, nC, A);
    }
}
void Merge(int *B, int p, int *C, int q, int *A)
{
    int i, j, k;
    i = j = k = 0;
    while (i < p&&j < q)
    {
    /*由A分配給B的元素肯定在分配給C的元素之前邑退,
         當(dāng)B[i]==C[j]應(yīng)該選擇B中的元素竹宋,確保穩(wěn)定性。*/
        if (B[i] > C[j])
            A[k++] = C[j++];
        else
            A[k++] = B[i++];
    }
    if (i == p)//B已到盡頭
        memcpy(A + k, C + j, (q - j) * sizeof(int));
    else
        memcpy(A + k, B + i, (p - i) * sizeof(int));

    free(B);
    free(C);
}

運(yùn)行結(jié)果

結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末地技,一起剝皮案震驚了整個(gè)濱河市蜈七,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莫矗,老刑警劉巖飒硅,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異作谚,居然都是意外死亡三娩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門妹懒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雀监,“玉大人,你說我怎么就攤上這事眨唬』崆埃” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵匾竿,是天一觀的道長瓦宜。 經(jīng)常有香客問我,道長岭妖,這世上最難降的妖魔是什么临庇? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮昵慌,結(jié)果婚禮上苔巨,老公的妹妹穿的比我還像新娘。我一直安慰自己废离,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布礁芦。 她就那樣靜靜地躺著蜻韭,像睡著了一般悼尾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肖方,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天闺魏,我揣著相機(jī)與錄音,去河邊找鬼俯画。 笑死析桥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艰垂。 我是一名探鬼主播泡仗,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼猜憎!你這毒婦竟也來了娩怎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤胰柑,失蹤者是張志新(化名)和其女友劉穎截亦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柬讨,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崩瓤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踩官。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片却桶。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卖鲤,靈堂內(nèi)的尸體忽然破棺而出肾扰,到底是詐尸還是另有隱情,我是刑警寧澤蛋逾,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布集晚,位于F島的核電站,受9級(jí)特大地震影響区匣,放射性物質(zhì)發(fā)生泄漏偷拔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一亏钩、第九天 我趴在偏房一處隱蔽的房頂上張望莲绰。 院中可真熱鬧,春花似錦姑丑、人聲如沸蛤签。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽震肮。三九已至称龙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戳晌,已是汗流浹背鲫尊。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沦偎,地道東北人疫向。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像豪嚎,于是被迫代替她去往敵國和親搔驼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)疙渣。 張土汪:刷leetcod...
    土汪閱讀 12,738評(píng)論 0 33
  • 概述 排序有內(nèi)部排序和外部排序匙奴,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大妄荔,一次不能容納全部...
    蟻前閱讀 5,168評(píng)論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,243評(píng)論 0 2
  • 【1】7泼菌,9,-1啦租,5哗伯,( ) A、4篷角;B焊刹、2;C恳蹲、-1虐块;D、-3 分析:選D嘉蕾,7+9=16贺奠;9+(-1)=8;(...
    Alex_bingo閱讀 18,858評(píng)論 1 19
  • 葫蘆娃不過才七兄弟错忱,前幾天去參加了一個(gè)育兒講座儡率,來自加拿大的爸爸來講他們夫妻是如何養(yǎng)育了十一個(gè)親生兒女的,十一個(gè)孩...
    王小刀刀閱讀 180評(píng)論 0 0