美文网首页
二路归并

二路归并

作者: km15 | 来源:发表于2020-02-05 12:55 被阅读0次
const int maxn = 100;
void merge(int a[], int l1, int r1, int l2, int r2) {
    int i = l1, j = l2;
    int temp[maxn], index = 0;

    //归并到temp数组
    while (i < r1 && j < r2) {
        if (a[i] <= a[j]) {
            temp[index++] = a[i++];
        }
        else {
            temp[index++] = a[j++];
        }
    }
    while (i <= r1) temp[index++] = a[i++];
    while (j <= r2) temp[index++] = a[j++];

    //将合并的数组回归原来
    for (int i = 0;i < index;i++) {
        a[l1 + i] = temp[i];
    }
}

void mergesort(int a[], int left, int right) {
    if (left < right) {
        int mid = (left + right) / 2;
        mergesort(a, left, mid);
        mergesort(a, mid + 1,right);
        merge(a, left, mid, mid + 1, right);
    }
}

迭代写法,不难记,如果用sort的话,但是用merge就很难记忆了
记忆:两层循环,加最里面merge或者sort函数

const int maxn = 100;
void merge(int a[], int l1, int r1, int l2, int r2) {
    int i = l1, j = l2;
    int temp[maxn], index = 0;

    //归并到temp数组
    while (i < r1 && j < r2) {
        if (a[i] <= a[j]) {
            temp[index++] = a[i++];
        }
        else {
            temp[index++] = a[j++];
        }
    }
    while (i <= r1) temp[index++] = a[i++];
    while (j <= r2) temp[index++] = a[j++];

    //将合并的数组回归原来
    for (int i = 0;i < index;i++) {
        a[l1 + i] = temp[i];
    }
}

(用sort比较好记忆)
void mergesort(int a[], int left, int right) {
    //step为组内元素个数,step / 2为左子区间元素个数,注意等号可以不去
    for (int i = 2;step / 2 <= n;step * 2) {
        //每step个元素一组,组内前step / 2和后step / 2元素进行合并
        for (int i = 1;i <= n;i += step) {
            int mid = i + step / 2 - 1; //左子区间元素个数为step / 2
            if (mid + 1 <= n) {  //右区间存在元素则合并
                //左子区间为[i,mid],右子区间为[mid + 1,min(i + step - 1,n)
                merge(a, i, mid, mid + 1, min(i + step - 1, n));
            }
        }
    }
}

相关文章

  • 排序算法之归并排序

    1、归并排序的基本思想 归并排序主要是二路归并排序。二路归并排序的基本思想,设数组a中存放了n个数据元素,初始时把...

  • 归并排序+基数排序

    归并排序 二路归并排序归并过程 O(n)整个归并排序需要⌈log2n⌉趟(k路归并需要⌈logkn⌉) 空间效率O...

  • 二路归并

    迭代写法,不难记,如果用sort的话,但是用merge就很难记忆了记忆:两层循环,加最里面merge或者sort函数

  • 二路归并

    参考文章:https://blog.csdn.net/weixin_39651041/article/detail...

  • 常见算法前端JS实现 — 排序

    1.排序算法 1.1 冒泡排序 1.2 快速排序 1.3 二路归并

  • 前端常见算法

    冒泡排序 快速排序 二路归并将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序 判断回文字符串 翻转字...

  • 【数据结构】【C#】021-归并类排序: ✌二路归并(稳定)

    归并排序:二路归并(稳定) 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即...

  • 算法复习-归并类排序(1)-二路归并排序

    二路归并排序 归并排序可以看作一个分而治之的过程:先将整个序列分成两半,对每一半分别进行归并排序,将得到两个有序序...

  • 软件设计师备考知识04

    1 排序 1 归并排序: 例:二路归并 将两个有序序列合并成一个有序序列。 过程: 2 关系 1 泛化、概化: 把...

  • 软件设计师备考知识04

    1 排序 1 归并排序: 例:二路归并 将两个有序序列合并成一个有序序列。 过程: 2 关系 1 泛化、概化: 把...

网友评论

      本文标题:二路归并

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