前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >归并排序

归并排序

作者头像
SakuraTears
发布2022-01-13 11:47:02
5140
发布2022-01-13 11:47:02
举报
文章被收录于专栏:从零开始的Code生活

归并排序将两个有序的排列归并为一个有序的排列。 归并算法都基于归并这个简单的操作,即将两个有序的数组归并成一个更大的有序数组。很快人们就根据这个操作发明了一种简单的递归排序算法:归并排序。要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来:你将会看到,归并排序最 吸引人的性质是它能够保证将任意长度为,的数组排序所需时间和,成正比;它的主要缺点则是它所需的额外空间。简单的归并排序如图所示。

图
原地归并

先创建一个数组aux将a的元素全部赋给aux。然后开始将两个有序的数组归并成一个有序的数组。 将a[lo, mid]和a[mid + 1, hi]两个有序数组归并为一个有序数组

图
代码语言:javascript
复制
void merge(int a[], int lo, int mid, int hi)
{
    int i, j;
    i = lo;
    j = mid + 1;
    int aux[hi + 1];
    for (int k = lo; k <= hi; k++)
    {
        aux[k] = a[k];
    }
    for (int k = lo; k <= hi; k++)
    {
        if (i > mid)
        {
            a[k] = aux[j++];
        }
        else if (j > hi)
        {
            a[k] = aux[i++];
        }
        else if (aux[j] < aux[i])
        {
            a[k] = aux[j++];
        }
        else
        {
            a[k] = aux[i++];
        }
    }
}

当左边(mid为中界)元素已经全部赋值到a中时,则不需要再考虑左边元素,直接把右边剩余元素全部赋值给a即可 if(i > mid) 当右边(mid为中界)元素已经全部赋值到a中时,则不需要再考虑右边元素,直接把左边剩余元素全部赋值给a即可 if(j > hi) 如果右边当前元素小于左边当前元素则将右边当前元素赋给a,(aux[j] < aux[i]) 右边当前元素大于等于左边当前元素,最后一个else

自上向下

自顶向下归并将一个数组先中间拆分,再把拆分的数组拆分,直到只有一个元素的数组,然后将每两个数组就行归并。最后归并为一个有序数组。

图
图
代码语言:javascript
复制
void gbsort(int a[], int lo, int hi)
{
    if (hi <= lo)
    {
        return;
    }
    int mid;
    mid = lo + (hi - lo) / 2;
    gbsort(a, lo, mid);
    gbsort(a, mid + 1, hi);
    merge(a, lo, mid, hi);
}
自底向上

自底向上归并第一次每两个元素的数组归并,然后每四个,八个......归并,最终归并成一个有序数组

图
代码语言:javascript
复制
void gbsort(int a[], int lo, int hi)
{
    int n = hi + 1; //n为数组长度
    for (int i = 1; i < n; i += i)//每次循环完了归并前一次翻倍的数组元素个数
    {
        for (int j = 0; j < n - i; j += i * 2)
        {
            if (j + i * 2 - 1 < hi)
            {
                merge(a, j, j + i - 1, j + i * 2 - 1);
            }
            else {
                merge(a, j, j + i - 1, hi);
            }
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年10月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原地归并
  • 自上向下
  • 自底向上
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档