利用的分治和递归的思想。
#include<stdio.h>
#include<malloc.h>
void merge(int *a,int p,int q,int r)//p到q为左边待合并的,q+1到r为右边待合并的
{
int k1=q-p+1;//左边待合并元素的个数
int k2=r-q;//右边待合并元素的个数
int i,j,k;
int *left,*right;
left=(int *)malloc((k1+1)*sizeof(int));
right=(int *)malloc((k2+1)*sizeof(int));
for(i=0;i<k1;i++)
left[i]=a[i+p];
for(i=0;i<k2;i++)
right[i]=a[i+q+1];
left[k1]=9999;//哨兵
right[k2]=9999;//哨兵
i=0;
j=0;
for(k=p;k<=r;k++)
{
if(left[i]<=right[j])
{
a[k]=left[i];
i++;
}
else
{
a[k]=right[j];
j++;
}
}
}
void merge_sort(int *a,int p,int r)//合并排序
{
int q;
if(p<r)
{
q=(p+r)/2;
merge_sort(a,p,q);//对p到q进行排序
merge_sort(a,q+1,r);//对q+1到r进行排序
merge(a,p,q,r);//合并p到r
}
}
int main()
{
int i;
int a[20]={1,2,5,4,8,9,7,4,5,6,9,8,10,25,96,45,10,23,999,0};
merge_sort(a,0,19);
for(i=0;i<20;i++)
printf("%d ",a[i]);
printf("\n");
}