#include<stdio.h>
#include<malloc.h>
void Merge(int a[],int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
int *L=(int *)malloc(sizeof(int)*(n1)); //分配内存空间给未知大小的数组
int *R=(int *)malloc(sizeof(int)*(n2));
for(int i=0;i<n1;i++) //i必须从0开始技术,而不是从p开始
L[i]=a[p+i];//此处(p+i)而非i,因为p可能不为0
for(i=0;i<n2;i++)
R[i]=a[q+1+i];
i=0;
int j=0;
int k=p;
while(i<n1&&j<n2&&k<=r)
{
if(L[i]<=R[j])
a[k++]=L[i++];
else
a[k++]=R[j++];
}
while(k<=r)
{
if(i<n1&&j>=n2)
a[k++]=L[i++];
if(i>=n1&&j<n2)
a[k++]=R[j++];
}
}
void MergeSort(int a[],int p,int r)
{
if(p<r) //如果没有这个限制,r一直会变小,进入死循环
{
int q=(p+r)/2;
MergeSort(a,p,q);
MergeSort(a,q+1,r);
Merge(a,p,q,r);
}
}
void main()
{
int a[10]={2,5,8,7,6,9,0,3,1,4};
MergeSort(a,0,9);
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}