合并排序牺牲O(n)的空间
代码如下:
#include<stdio.h>
int A[1000000];
int B[1000000];
void mergesort(int a[],int x,int y,int b[])
{
if(y-x>1)
{
int m,p,q;
m=x+(y-x)/2;
mergesort(a,x,m,b);
mergesort(a,m,y,b);
p=x,q=m;
int i=x;
while(p<m||q<y)
{
if(q>=y||(p<y&&a[p]<=a[q]))
b[i++]=a[p++];
else
b[i++]=a[q++];
}
for(int i=x;i<y;i++)
a[i]=b[i];
}
}
void main()
{
int n;
scanf("%d\n",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
mergesort(A,0,n,B);
for(int i=0;i<n-1;i++)
printf("%d ",A[i]);
printf("%d\n",A[n-1]);
}