美文网首页程序员
算法学习03_归并排序

算法学习03_归并排序

作者: 追日填海 | 来源:发表于2018-10-07 16:54 被阅读8次

基本思想

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


递归版归并排序

如上图所示

  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);
            }
        }
    }

相关文章

  • 算法入门——归并排序、希尔排序

    上篇文章我们学习了算法入门——堆排序,这篇文章我们学习算法入门——归并排序、希尔排序。 归并排序 归并排序是将一个...

  • 排序学习 - 为了面对算法面试(2)

    排序学习 - 为了面对算法面试(1) - 选择排序/冒泡排序/插入排序 4.归并排序:归并排序(MERGE-SOR...

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 算法学习03_归并排序

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

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 6-十大排序篇二

    十大排序(2) 今天先学习第二大类排序算法 归并排序 排序排序 希尔排序 堆排序 1.归并排序 分析:利用归并的思...

  • 《算法》归并排序学习

    继续学习《算法》,这次依然是排序算法的学习:归并排序。在这次的学习中本人遇到了一些问题,主要就是归并排序的实现较前...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 算法入门——计数排序、桶排序、基数排序

    上篇文章我们学习了算法入门——归并排序、希尔排序,这篇文章我们学习算法入门——计数排序、桶排序、基数排序。 计数排...

网友评论

    本文标题:算法学习03_归并排序

    本文链接:https://www.haomeiwen.com/subject/mmvlaftx.html