算法学习03_归并排序

基本思想

归并排序是分而治之的算法思想的实际应用,其排序过程是将待排序序列逐层分解直到最后只有一个元素,然后在反向合并。


递归版归并排序

如上图所示

  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\},此时各组只有一个元素不再继续分解。
  4. 合并\{38\}\{27\}\{27,38\}
  5. 分解\{43, 3\}\{43\}\{3\},此时各组只有一个元素不再继续分解。
  6. 合并\{43\}\{3\}\{3, 43\}.
  7. 合并 4,6结果\{27,38\}\{3, 43\}\{3, 27,38,43\}
  8. 分解\{9,82,10\}\{9,82,\},\{10\}
  9. 分解\{9,82,\}\{9\},\{82\},此时各组只有一个元素不再继续分解。
  10. 合并\{9\},\{82\}\{9,82\}
  11. 合并\{9,82\},\{10\}\{9,10,82\}
  12. 合并7,11结果\{3, 27,38,43\}\{9,10,82\}\{3, 9,10,27,38, 43, 82\}排序结束。
    在整个排序过程中分解过程较为简单,就是一分为二,核心在合并过程,即将两个有序序列合并为一个有序序列

源码实现

递归版

    static void merge(T arr[], int size) {
        merge(arr, 0, size - 1);
    }
    static void merge(T arr[], int L, int R) {
        if (L >= R) {
         //  递归结束
            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 索引归并后的数组[L, R],j索引aux左半边数组[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);
            }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,250评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,757评论 0 15
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,328评论 0 35
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    闲云清烟阅读 782评论 0 6
  • 壶觞倾覆留夷蕊,泠露庭柯鸿雁飞。 半揽长铗伤流景,烟云几缕醉扶归。 注:新韵,首句平起不入韵。 1、留夷, 基本意...
    幽小窗阅读 832评论 38 58