思想:分治,先将子序列排好,再两两归并。
#include <iostream>
using namespace std;
void ms(int p[],int q[],int left,int mid,int right)//归并
{
int i,j;
int k=left;
i=left;j=mid+1;
while(i<=mid&&j<=right)
{
if(p[i]<=p[j]) //注意是小于等于,保持排序的稳定性
{
q[k]=p[i];
i++;
k++;
}
else
{
q[k]=p[j];
j++;
k++;
}
}
while(i<=mid)
{
q[k]=p[i];
i++;
k++;
}
while(j<=right)
{
q[k]=p[j];
j++;
k++;
}
}
void m(int r[],int s[],int left,int right) //拆分
{ //不断拆成一半,直到拆成一项一项的。
int t[20];
if(left==right)
{
s[left]=r[right];
}
else
{
int mid=(left+right)/2;
m(r,t,left,mid); //排列本轮 t [left到mid]
m(r,t,mid+1,right); //排列本轮 t [mid+1到right]
ms(t,s,left,mid,right); //利用本轮计算出的 t[left到mid]和t[mid+1到right]
} //排列出上一轮的t[left到right]
return ;
}
int main ()
{
int n;
cin>>n;
int a[n+1];
int i;
for(i=1;i<=n;i++)cin>>a[i];
m(a,a,1,n);
for(i=1;i<=n;i++)
{
if(i>1)cout<<" ";
cout<<a[i];
}
}