归并排序:是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
代码如下(从小到大):
#include<cstdio>
int n,num[10000],r[10000]; //num是待排序数组,r是临时数组
void mergesort(int s,int t) //对[s,t]区间的无序数组进行归并排序
{
int m,i,j,k;
if(s==t) return ; //只有一个数据就不必排序了
m=(s+t)/2; //取区间中点
mergesort(s,m); //以中点二分,对左边子区间进行排序
mergesort(m+1,t); //以中点二分,对右边子区间进行排序
i=s; //以下是一次归并操作
j=m+1;
k=s;
while(i<=m&&j<=t) //两个子序列从小到大合并,直至其中一列结束
{
r[k]=num[i]<num[j]?num[i++]:num[j++];
k++;
}
while(i<=m) {r[k]=num[i++];k++;}
while(j<=t) {r[k]=num[j++];k++;}
for(i=s;i<=t;i++)
num[i]=r[i];
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
mergesort(0,n-1);
for(int i=0;i<n;i++)
printf("%d ",num[i]);
}