#define MAX 1000000
void merge(int *a,int p,int q,int r) //将两个已经有序的数组合并到另一个数组(按照从小到大的顺序)
{
int n1,n2,i,j;
n1=q-p+1;
n2=r-q; //将数组a[p,r]分为L[p,q],R[q+1,r]
int *L=new int[n1+1];
int *R=new int[n2+1];
for(i=p;i<=q;i++)
{
L[i-p]=a[i]; //将a[p]到a[q]的值赋给L[0]到L[q-p];
}
for(j=q+1;j<=r;j++)
{
R[j-q-1]=a[j]; //将a[q+1]到a[r]的值赋给R[0]到R[r-q];
}
L[n1]=MAX; //设置一个哨兵,表示数组的值已取完
R[n2]=MAX; //设置一个哨兵,表示数组的值已取完
i=j=0;
for(int k=p;k<=r;k++) //将R与L数组合并
{
if(L[i]<=R[j])
{
a[k]=L[i++];
}
else
{
a[k]=R[j++];
}
}
}
void merge_sort(int *a,int p,int r)
{
int q;
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[p,r]
}
void merge(int *a,int p,int q,int r) //将两个已经有序的数组合并到另一个数组(按照从小到大的顺序)
{
int n1,n2,i,j;
n1=q-p+1;
n2=r-q; //将数组a[p,r]分为L[p,q],R[q+1,r]
int *L=new int[n1+1];
int *R=new int[n2+1];
for(i=p;i<=q;i++)
{
L[i-p]=a[i]; //将a[p]到a[q]的值赋给L[0]到L[q-p];
}
for(j=q+1;j<=r;j++)
{
R[j-q-1]=a[j]; //将a[q+1]到a[r]的值赋给R[0]到R[r-q];
}
L[n1]=MAX; //设置一个哨兵,表示数组的值已取完
R[n2]=MAX; //设置一个哨兵,表示数组的值已取完
i=j=0;
for(int k=p;k<=r;k++) //将R与L数组合并
{
if(L[i]<=R[j])
{
a[k]=L[i++];
}
else
{
a[k]=R[j++];
}
}
}
void merge_sort(int *a,int p,int r)
{
int q;
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[p,r]
}
}
//注意在运算中间数组越界!!!!