归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采“分而自治”用的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
图片来源于网络
核心代码:
void abc(int x[],int q,int p){
if(q>=p)return;
int m=q+p>>1;
abc(x,q,m);
abc(x,m+1,p);
int k=0;
int i=q,j=m+1;
while(i<=m&&j<=p){
if(x[i]<=x[j])y[k++]=x[i++];
else y[k++]=x[j++];
}
while(i<=m)y[k++]=x[i++];
while(j<=p)y[k++]=x[j++];
for(i=q,j=0;i<=p;i++,j++)
x[i]=y[j];
}
完整代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+100;
int x[N],y[N];
void abc(int x[],int q,int p){
if(q>=p)return;
int m=q+p>>1;
abc(x,q,m);
abc(x,m+1,p);
int k=0;
int i=q,j=m+1;
while(i<=m&&j<=p){
if(x[i]<=x[j])y[k++]=x[i++];
else y[k++]=x[j++];
}
while(i<=m)y[k++]=x[i++];
while(j<=p)y[k++]=x[j++];
for(i=q,j=0;i<=p;i++,j++)
x[i]=y[j];
}
int main(){
int n;
cin>>n;
int i,j;
for(i=0;i<n;i++) cin>>x[i];
abc(x,0,n-1);
for(i=0;i<n;i++){
cout<<x[i]<<' ';
}
}