[OI学习笔记]归并排序

本文深入解析归并排序的实现过程,包括划分、递归及合并三个核心步骤,详细阐述了如何通过比较序列中的元素,将两个有序序列合并为一个更大的有序序列。文章还提供了具体的代码实现,展示了归并排序的时间复杂度为O(N*log2N),并指出其需要O(N)的辅助空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现过程

  根据分治三步走策略,归并排序分为划分,递归,合并三个步骤

  复杂度O(N*log2N)

划分

  把序列分成左右尽量等长的两半

递归

  分别对左右两边进行归并排序

合并

  问题是。。。怎么把两个有序序列合并成一个大的有序序列?(;′⌒`)

  合并策略:每次比较左右两个序列中最小的那一个,将更小的那个加入辅助空间(因为已经有序,所以若a<=b,则a一定<=b后面的数),然后再把辅助空间的有序序列复制回来即可。不难看出,需要辅助空间复杂度为O(N)。

代码:

void m_sort(int A[],int x,int y,int T[]){
    int m=x+(y-x)/2;
    int p=x,q=m,i=x;
    m_sort(A,x,m,T);
    m_sort(A,m,y,T);
    while(p<m||q<y){
        if(q>=y||(p<m&&A[p]<=A[q]))
            T[i++]=A[p++];//从左半复制 
        else 
            T[i++]=A[q++];//否则从右半复制
    }
    for(i=x;i<=y;i++)
        A[i]=T[i];
} 

 

 

 

 

 

转载于:https://www.cnblogs.com/sjrb/p/10294484.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值