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

基本思想

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


遞歸版歸并排序

如上圖所示

  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\},此時各組只有一個元素不再繼續(xù)分解。
  4. 合并\{38\},\{27\}\{27,38\}。
  5. 分解\{43, 3\}\{43\},\{3\},此時各組只有一個元素不再繼續(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\},此時各組只有一個元素不再繼續(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é)束。
    在整個排序過程中分解過程較為簡單,就是一分為二,核心在合并過程,即將兩個有序序列合并為一個有序序列

源碼實現(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,303評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,828評論 0 15
  • 概述排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,372評論 0 35
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    閑云清煙閱讀 821評論 0 6
  • 壺觴傾覆留夷蕊,泠露庭柯鴻雁飛。 半攬長鋏傷流景,煙云幾縷醉扶歸。 注:新韻,首句平起不入韻。 1、留夷, 基本意...
    幽小窗閱讀 875評論 38 58

友情鏈接更多精彩內(nèi)容