#include<stdio.h>
#include<malloc.h>
void merge(int A[],int l,int m,int r)
{
int *t;
t=(int *)malloc((r-l+1)*sizeof(int)); //动态分配内存
int r1,l1;
int b=0;//b的初始值应该为0,之前一直编译错误的原因就是让b值为l,造成数组t越界,导致最后错误,谨记!
r1=m+1;
l1=l;
while(l1<=m&&r1<=r)//左半区和右半区相互比较,值较小的放入临时数组
{
if(A[l1]<A[r1])
t[b++]=A[l1++];
else
t[b++]=A[r1++];
}
while(l1<=m)//将左半区的剩余元素全放入临时数组
{
t[b]=A[l1];
b++;l1++;
}
while(r1<=r)//将左半区的剩余元素全放入临时数组
{
t[b]=A[r1];
b++;r1++;
}
b=0;//从零开始,依次将其值赋给原数组。若不赋值为0,依然会造成越界。
while(l<=r)
{
A[l]=t[b];
l++;b++;
}
free(t);//清除内存
}
void mergesort(int A[],int l,int r)
{ int m;
if(l<r) //保证最后有递归划分至最后只剩一个元素
{m=(l+r)/2;
mergesort(A,l,m);
mergesort(A,m+1,r);
merge(A,l,m,r);
}
}
int main()
{ int N;
printf("请输入需排序数组大小:");
scanf("%d",&N);
int a[N];int i;
printf("请输入数组的值:");
for(int j=0;j<N;j++)
scanf("%d",&a[j]);
mergesort(a,0,N-1);
for(i=0;i<N;i++)
printf("%d ",a[i]);
return 0;
}