归并排序板子题
归并排序的原理许多dalao都讲过了,我这里不再赘述
题目名字叫做归并排序,大家就不要用快排骗AC了/doge
(虽然我试了一下快排也可以过
这里主要是提供一种简洁的码风
#include<bits/stdc++.h>
#define N 100010
using namespace std;
template<typename T>inline void read(T &n){
int w=1;n=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){n=(n<<1)+(n<<3)+(ch&15);ch=getchar();}
n*=w;
}
int c[N],now[N];//c数组是要排序的数组,now数组记录此次操作需要改变的数组
inline void merge(int l,int r){
int mid=(l+r)>>1;int i=l,j=mid+1,p=l;
while(i<=mid&&j<=r){
if(c[i]>c[j]){
now[p++]=c[j++];
}else now[p++]=c[i++];
}
while(i<=mid)now[p++]=c[i++];
while(j<=r)now[p++]=c[j++];
for(int i=l;i<=r;++i)c[i]=now[i];
}
inline void mergesort(int l,int r){
if(l>=r)return;
int mid=(l+r)>>1;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,r);
}
int main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int n;read(n);
for(int i=1;i<=n;++i)read(c[i]);
mergesort(1,n);
for(int i=1;i<=n;++i)printf("%d ",c[i]);
return 0;
}
注:该代码对于洛谷用户jhknmj_ZzDJR多有借鉴