#include<iostream>
using namespace std;
const int MAX=100000;
const int LEN=100;
//按从小到大的排列合并数组A,其中A的p~q和q+1~r部分是已经排好序的
int merge(int A[LEN],int p,int q,int r)//p,q,r是数组下标
{
int n1=q-p+1;
int n2=r-q;
int L[LEN],R[LEN];//设置一个左右数组
for(int i=0;i<n1;i++)//将A的p~q部分赋给左数组
L[i]=A[p+i];
for(i=0;i<n2;i++)//将A的q+1~r部分赋给右数组
R[i]=A[q+1+i];
L[n1]=MAX; //在左右数组设置一个哨兵
R[n2]=MAX;
int j=0;
for(int k=p;k<=r;k++)//开始合并
{
if(L[i]<R[j]) //将左右数组中较小的数赋给A
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
return 0;
}
//用合并算法递归地排列数组A
int merge_sort(int A[LEN],int p,int r)
{
int q=0;
if(p<r)
{
q=(p+r)/2;
merge_sort(A,p,q); //排列A的p~q部分
merge_sort(A,q+1,r); //排列A的q+1~r部分
merge(A,p,q,r); //合并A的已排好序的两部分
}
return 0;
}
int main()
{
int A[LEN];
int n;
cout<<"please input the length of A:"<<endl;
cin>>n;
cout<<"input A:"<<endl;
for(int i=0;i<n;i++)
cin>>A[i];
merge_sort(A,0,n-1); //用分治法排序A
for(i=0;i<n;i++)
cout<<A[i]<<" ";
cout<<endl;
return 0;
}