自己编写的合并排序
/* name: merge-sort.c
* usage: realize merge sort
* writer: shangliuyan
*
* description:
*
* merge_sort(A,b,e)
* m<-(b+e)/2
* if b<e
* merg_sort(A,b,r)
* merg_sort(A,m+1,e)
* merge(A,b,m,e)
*
* merge(A,b,m,e)
* n1<-m-b+1
* n2<-e-m
* i<-j<-0
* while(i<=n1)
* L1[i]<-A[b+i]
* i++
* while(i<=n1)
* L2[j]<-A[m+j]
* j++
* m<-b
* i<-j<-0
* for m to e
* if i>n1-1
* while j<=n2-1
* A[m++]<-L2[j++]
* break
* if j>n2-1
* while i<=n1-1
* A[m++]<-L1[i++]
* break
* if L1[i]<L2[j]
* A[m]=L1[i]
* i++
* else
* A[m]=L2[j]
* j++
*
*
*
* */
#include<stdio.h>
void merge(int A[],int b,int m,int e)
{
int n1=m-b+1;
int n2=e-m;
int L[n1-1],R[n2-1];//use n1-1 and n2-1
/*construct two segment arry*/
for(int i=0;i<=n1-1;i++)
{
L[i]=A[b+i];
}
for(int j=0;j<=n2-1;j++)
{
R[j]=A[m+j+1];
}
/*merge two arry*/
int i=0,j=0;
for(int k=b;k<=e;k++)
{
if(i>n1-1)
{
while (j<=n2-1)
{
A[k++]=R[j++];
}
break;
}
if(j>n2-1)
{
while (i<=n1-1)
{
A[k++]=L[i++];
}
break;
}
if(L[i]<R[j])
{
A[k]=L[i];
i++;
}
else
{
A[k]=R[j];
j++;
}
}
}
void merge_sort(int A[],int b,int e)
{
if(b<e)
{
int m= (b+e)/2;
merge_sort(A,b,m);
merge_sort(A,m+1,e);
merge(A,b,m,e);
}
}
void print(int a[],int n)
{
int i=0;
while(i<=n)
{
printf(" %d ",a[i]);
i++;
}
printf(" \n");
}
int main()
{
int a[]={8,4,5,9,7,20};
int n=sizeof(a)/sizeof(a[0]);
printf("the arry before sort is:");
print(a,n-1);
merge_sort(a,0,n-1);
printf("the arry after sort is:");
print(a,n-1);
}