方法一:递归形式的归并排序
void merge(
int a[],
int b[],
int l,
int m,
int r){
// 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 *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;
}
方法二:去除递归的方法
void merge_pass(
int x[],
int y[],
int s,
int n){
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;
}
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;
}