排序算法——归并排序

1.归并排序算法的基本原理如下:

归并排序算法的基本思想是“分治法”,本文的程序实现采用递归。

伪码表示:
算法 MergeSort(A,p,r)
输入:数组A[p…r]
输出:升序排列的数组A

if p<r
then q<-(p+r)/2
     MergeSort(A,p,q)//递归处理左部分元素
     MergeSort(A,q+1,r)//递归处理右部分元素
     Merge(A,p,q,r)//合并

2.程序实现

void Merge(int a[],int b[],int start,int mid,int end)
{
    int i,j,k;
    i=start;
    j=mid+1;//避免重复比较a[mid]
    k=0;

    while(i<=mid&&j<=end)//a数组的左右两部分并没有完全合并到b数组中
    {
        //对数组a的左右两部分的元素进行比较,数值小的优先进入b数组中
        if(a[i]<=a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];
    }

    while(i<=mid)//表示数组a的左半部分元素还有剩余
        b[k++]=a[i++];
    while(j<=end)//表示数组a的右半部分元素还有剩余
        b[k++]=a[j++];
    
    for(int i=0;i<k;i++)//将排好序的元素移入数组a中
        a[start+i]=b[i];
}

void MergeSort(int a[],int b[],int start,int end)
{
    int mid;
    if(start<end)
    {
        mid=start+(end-start)/2;
        MergeSort(a,b,start,mid);//处理左半部分
        MergeSort(a,b,mid+1,end);//处理右半部分
        Merge(a,b,start,mid,end);//将排好序的两部分合并
    }
}

3.时间复杂度分析:

算法的基本操作可以认为是比较。

考虑最差情况:
假设n=6,最后一次进行合并时,左半部分和右半部分均有3个元素。
不妨设为 1 4 7 和 0 3 9
1和0比较,0进入有序部分
1和3比较,1进入有序部分
4和3比较,3进入有序部分
4和9比较,4进入有序部分
7和9比较,7进入有序部分
最后9进入有序部分
6个元素进行合并时最差进行5此比较。
因此n个元素进行合并时,最差进行n-1次比较

T(n)=2T(n/2)+n-1
T(1)=0

采用换元迭代或者主定理可得归并排序算法的时间复杂度为O(nlogn)。

4.稳定性:

归并排序算法是稳定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值