其实老师上课时在黑板写过,把他写的复制粘贴一遍就可以了。
#include <stdio.h>
#include <stdlib.h>
void mergesort(int *a,int asize,int l,int r);
void merge(int a[],int l,int mid,int r);//[l,mid),[mid,r)
int main()
{
int a[100],n;
scanf("%d",&n);
for (int i=0;i<n;i++) scanf("%d",&a[i]);
mergesort(a,n,0,n);
}
void mergesort(int *a,int asize,int l,int r)
{
if (r-l<=1) return;
int mid=(l+r)/2;
if ((l+r)%2>0) mid++;
mergesort(a,asize,l,mid);
mergesort(a,asize,mid,r);
merge(a,l,mid,r);
for (int i=0;i<asize-1;i++)
{
printf("%d ",*(a+i));
}
printf("%d\n",*(a+asize-1));
}
void merge(int a[],int l,int mid,int r)
{
int *temp=(int*)malloc((r-l)*sizeof (int));
int i=l,j=mid,k=0;
while (i<mid&&j<r)
{
while (i<mid&&j<r&&a[i]<=a[j])
temp[k++]=a[i++];
while (i<mid&&j<r&&a[i]>a[j])
temp[k++]=a[j++];
}
while (i<mid) temp[k++]=a[i++];
while (j<r) temp[k++]=a[j++];
for (int i=l;i<r;i++)
{
a[i]=temp[i-l];
}
free(temp);
}