原理
模拟过程
题目描述
题目描述(来自洛谷1177归并排序)
将读入的 N 个数从小到大排序后输出。
输入格式
第一行为一个正整数 N。
第二行包含 N 个空格隔开的正整数 a[1]...a[n] ,为你需要进行排序的数。
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
数据范围
说明/提示
对于20% 的数据,有 1 <= N <= 10^31≤N≤10^3
;
对于 100% 的数据,有 1 <= N <= 10^51≤N≤10^5 ,1 \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);
get(mid+1,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[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,因为快排代码
量少,用复杂度也是排序中排名第二,除必要时,建议都用快排。