归并排序(MergeSort)


二路归并排序

1.稳定排序
2.时间复杂度,最好最坏和平均 o(nlog2n)
3.空间复杂度o(n)
4.与序列初始状态无关


提示:以下是本篇文章正文内容,下面案例可供参考

一、概述

归并排序是将两个或两个以上的有序表组成一个新的有序表

二、代码

1.一次归并

代码如下(示例):

int *b = (int *)malloc(sizeof(int) * Maxsize); //建立辅助数组
void Merge(int a[], int low, int mid, int high)
{
    int i, j, k;
    for (i = low; i <= high; i++)
    {
        b[i] = a[i]; //将数组a复制到数组b
    }
    for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) //a[low]到a[high]从小到大排序
    {
        if (b[i] <= b[j])
            a[k] = b[i++];
        else
            a[k] = b[j++];
    }
    while (i <= mid) //两个while只会运行其中一个
        a[k++] = b[i++];
    while (j <= high)
        a[k++] = b[j++];
}

2.MergeSort(递归)

代码如下(示例):

void MergeSort(int a[], int low, int high)
{
    if (low < high)
    {
        int mid = (low + high) / 2;
        MergeSort(a, low, mid);
        MergeSort(a, mid + 1, high);
        Merge(a, low, mid, high);
    }
}

总结

归并排序还是很好理解的。值得注意的是归并排序的比较次数,例如两个各有n个元素的有序表合并为一个有序表,最少比较n次(一个表中最小的元素比另一个表中最大的元素还要大),最多比较2n-1(两个表间隔比较);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值