归并排序(1177)详细讲解+代码

原理

在这里插入图片描述

模拟过程

在这里插入图片描述

题目描述

题目描述(来自洛谷1177归并排序)
将读入的 N 个数从小到大排序后输出。

输入格式
第一行为一个正整数 N。

第二行包含 N 个空格隔开的正整数 a[1]...a[n] ,为你需要进行排序的数。

输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

数据范围

说明/提示
对于20% 的数据,有 1 <= N <= 10^31≤N≤10^3
 ;

对于 100% 的数据,有 1 <= N <= 10^51≤N≤10^51 \le a_i \le 10^91≤a i≤10 9

代码

#include<bits/stdc++.h>
using namespace std;
int b[100005],n,a[100005];
void get(int l,int r){
	if(l>=r)return;//如果排序完,就返回
	int mid=(l+r)/2;
	get(l,mid);//分成两个区间进行排序,分别是l到mid
	get(mid+1,r);//还有mid+到r
	int i=l,j=mid+1,num=0;
	while(i<=mid&&j<=r)
		if(a[i]<a[j])num+=1,b[num]=a[i],i++;//如果左区间的当前值,小于右区间的当前值,就放左区间
			else num+=1,b[num]=a[j],j++;//否则就放右区间
	//最后肯定会有一段填完,一段剩余
	while(i<=mid)num+=1,b[num]=a[i],i++;//如果为左区间有剩余,那么把答案数组直接加上左区间剩余部分
	while(j<=r)num+=1,b[num]=a[j],j++;//否则就加上右区间剩余
	for(int k=l;k<=r;k++){//把答案数组填回a数组
		a[k]=b[k-l+1];
	}
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	get(1,n);//排序
	for(int k=1;k<=n;k++)
		cout<<a[k]<<" ";//输出答案
}

时间复杂度

复杂度为log级别,和快排差不多,但是归并比快排要稳定,具体时间复杂度
为nlog(2n);
所以总体来说,归并比快排好,但是考试时建议用快排:sort,因为快排代码
量少,用复杂度也是排序中排名第二,除必要时,建议都用快排。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值