归并排序
#include <stdio.h>
#include <stdlib.h>
void msort(int a[],int tmp[],int left,int right);
void mergesort(int a[],int n);
void merge(int a[], int tmp[], int lpos,int rpos,int rightend);
int main(void)
{
int a[]={3,4,6,7,1,2,5};
mergesort(a,7);
int i;
for(i=0;i<7;i++)
{
printf("%d ",a[i]);
}
return 0;
}
void msort(int a[],int tmp[],int left,int right)
{
int center;
if(left<right)
{
center=(left+right)/2;
msort(a,tmp,left,center);
msort(a,tmp,center+1,right);
merge(a,tmp,left,center+1,right);
}
}
void mergesort(int a[],int n)
{
int* tmp;
tmp=malloc(n*sizeof(int));
if(tmp!=NULL)
{
msort(a,tmp,0,n-1);
free(tmp);
}
else
printf("no space for tmp array");
}
void merge(int a[], int tmp[], int lpos,int rpos,int rightend)
{
int i,leftend,num,tmppos;
leftend=rpos-1;
tmppos=lpos;
num=rightend-lpos+1;
while(lpos<=leftend && rpos<=rightend)
if(a[lpos]<=a[rpos])
tmp[tmppos++]=a[lpos++];
else
tmp[tmppos++]=a[rpos++];
while(lpos<=leftend)
tmp[tmppos++]=a[lpos++];
while(rpos<=rightend)
tmp[tmppos++]=a[rpos++];
for(i=0;i<num;i++,rightend--)
a[rightend]=tmp[rightend];
}