// int *b=new int[r-l+1];
int i,j,k;
i=l;
j=m+1;
k=l;
while(i<=m&&j<=r){
if(a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<=m)
b[k++]=a[i++];
while(j<=r)
b[k++]=a[j++];
for(int s=l;s<=r;s++)
a[s]=b[s];
// delete[] b;
}
void msort(int a[],int b[],int l,int r){
if(l<r){
int m=(l+r)/2;
msort(a,b,l,m);
msort(a,b,m+1,r);
merge(a,b,l,m,r);
}
}
void merge_sort(int a[],int n){
_FUNC;
int *b=new int[n];
msort(a,b,0,n-1);
delete[] b;
}
方法二:去除遞歸的方法
int i=0;
while(i+2*s-1<n){
merge(x,y,i,i+s-1,i+2*s-1);
i+=2*s;
}
if(i+s<n)
merge(x,y,i,i+s-1,n-1);
else
for(int j=i;j<=n-1;j++)
y[j]=x[j];
}
void merge_sort2(int a[],int n){
_FUNC;
int *b=new int [n];
int s=1;
while(s<n){
merge_pass(a,b,s,n);
s+=s;
merge_pass(b,a,s,n);
s+=s;
}
delete[] b;
}