排序算法之歸并排序

1使兔、歸并排序的基本思想

歸并排序主要是二路歸并排序。二路歸并排序的基本思想掺冠,設數(shù)組a中存放了n個數(shù)據(jù)元素菇曲,初始時把它們看成是n個長度為1的有序子數(shù)組冠绢,然后從第一個有序子數(shù)組開始,把相鄰的有序子數(shù)組兩兩合并常潮,等到n/2個長度為2的新的有序子數(shù)組(當n為奇數(shù)時弟胀,最后一個新的有序子數(shù)組的長度為1)。對這些新的有序子數(shù)組再進行兩兩合并喊式。如此重復直到得到一個長度為n的有序數(shù)組為止孵户。
如下如所示是序列{72,73,71,23,94,16,5,68,64}的二路歸并排序過程。

一次二路歸并排序算法的目標是把若干個長度為k的相鄰有序子數(shù)組從前向后進行兩兩歸并岔留,得到個數(shù)減半的長度為2k的相鄰有序子數(shù)組延届。需要考慮的問題是:若元素個數(shù)是2k的整數(shù)倍,則兩兩歸并正好完成n個數(shù)據(jù)元素的一次二路歸并贸诚;若元素個數(shù)不是2k的整數(shù)倍方庭,則當歸并到最后一組時,剩余的元素個數(shù)會不足2k個酱固,這時的處理方法有是:

  1. 若剩余的元素個數(shù)大于k而小于2k械念,則把前k個元素作為一個子數(shù)組,把剩余的元素作為最后一個子數(shù)組运悲。
  2. 若剩余的元素個數(shù)小于k時龄减,也就是剩余的元素個數(shù)只夠一組時,則不用再進行兩兩歸并排序班眯。

2希停、歸并排序的代碼實現(xiàn)

/**
 *
 * @param a 目標序列
 * @param n  目標序列的長度
 * @param swap 一次二路歸并排序后的有序子數(shù)組存于此數(shù)組中
 * @param k 有序子數(shù)組的長度
 */
void Merge(int a[], int n, int swap[], int k) {
    int m = 0, i, j, start2, end1, end2;
    int start1 = 0;//第一個有序子數(shù)組的下界為0
    while (start1 + k <= n - 1) {
        start2 = start1 + k;//計算第二個有序子數(shù)組的下界
        end1 = start2 - 1;//計算第一個有序子數(shù)組的上界
        end2 = (start2 + k - 1 <= n - 1) ? start2 + k - 1 : n - 1;//計算第二個有序子數(shù)組的上界
        //兩個有序子數(shù)組合并
        for (i = start1, j = start2; i < end1 && j < end2; m++) {
            if (a[i] <= a[j]) {
                swap[m] = a[I];
                I++;
            } else {
                swap[m] = a[j];
                j++;
            }
        }
        //子數(shù)組2已經(jīng)歸并完成,將子數(shù)組1中剩余的元素存放到數(shù)組swap中
        while (i <= end1) {
            swap[m] = a[I];
            m++;
            I++;
        }
        //子數(shù)組1已經(jīng)歸并完成署隘,將子數(shù)組2中剩余的元素存放到數(shù)組swap中
        while (j <= end2) {
            swap[m] = a[j];
            m++;
            j++;
        }
        start1 = end2 + 1;
    }
    //將原始數(shù)組中只夠一組的數(shù)據(jù)元素順序存放到數(shù)組swap中
    for (int k = start1; k < n; ++k, m++) {
        swap[m] = a[k];
    }
}

void MergeSort(int a[], int n) {
    int k = 1;
    int *swap;
    swap = (int *) malloc(sizeof(int) * n);//申請動態(tài)數(shù)組空間
    while (k < n) {
        Merge(a, n, swap, k);
        for (int j = 0; j < n; ++j) {
            a[j] = swap[j];//將元素從臨時數(shù)組中放回到數(shù)組a中
        }
        k = 2 * k;//歸并長度加倍
    }
    free(swap);
}

3宠能、歸并排序的效率分析

  1. 對n個數(shù)據(jù)元素進行一次二路歸并排序時,歸并的次數(shù)約為lbn磁餐,任何一次的二路歸并排序元素的比較次數(shù)都約為n-1违崇,所以二路歸并排序算法的時間復雜度為O(nlbn)
  2. 二路歸并排序時使用了n個臨時內(nèi)存單元存放數(shù)據(jù)元素诊霹,所以二路歸并排序算法的空間復雜度為O(n)羞延。
  3. 由于二路歸并排序算法是相鄰子數(shù)組兩兩合并,對于相同的書元素脾还,能夠保證原來在前邊的元素排序后任在前邊伴箩,因此二路歸并排序算法是一種穩(wěn)定的排序算法。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鄙漏,一起剝皮案震驚了整個濱河市嗤谚,隨后出現(xiàn)的幾起案子棺蛛,更是在濱河造成了極大的恐慌,老刑警劉巖呵恢,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠值,死亡現(xiàn)場離奇詭異,居然都是意外死亡渗钉,警方通過查閱死者的電腦和手機彤恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳄橘,“玉大人声离,你說我怎么就攤上這事√绷” “怎么了术徊?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鲸湃。 經(jīng)常有香客問我赠涮,道長,這世上最難降的妖魔是什么暗挑? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任笋除,我火速辦了婚禮,結果婚禮上炸裆,老公的妹妹穿的比我還像新娘垃它。我一直安慰自己,他們只是感情好烹看,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布国拇。 她就那樣靜靜地躺著,像睡著了一般惯殊。 火紅的嫁衣襯著肌膚如雪酱吝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天靠胜,我揣著相機與錄音掉瞳,去河邊找鬼。 笑死浪漠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的霎褐。 我是一名探鬼主播址愿,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冻璃!你這毒婦竟也來了响谓?” 一聲冷哼從身側響起损合,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娘纷,沒想到半個月后嫁审,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡赖晶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年律适,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏插。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡捂贿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胳嘲,到底是詐尸還是另有隱情厂僧,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布了牛,位于F島的核電站颜屠,受9級特大地震影響,放射性物質發(fā)生泄漏鹰祸。R本人自食惡果不足惜甫窟,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望福荸。 院中可真熱鬧蕴坪,春花似錦、人聲如沸敬锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台夺。三九已至径玖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颤介,已是汗流浹背梳星。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滚朵,地道東北人冤灾。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像辕近,于是被迫代替她去往敵國和親韵吨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359