Merge Sort
合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称其为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来实现多路合并排序。
合并排序的基本流程如下:
1:首先将含有n个节点的待排序数据序列看作n个长度为一的有序子表组成,并将它们两两合并,得到长度为二的若干有序子表;
2:然后,在对这些子表进行两两合并,得到长度为四的若干有序子表,……
3:重复上述过程,直到最后子表的长度为n,从而完成排序过程。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 15
void MergeOne(int a[],int b[],int n,int l)
{
int i,j;
int k,s,e;
s=0;
while(s+l<n)
{
e=s+2*l-1;
if(e>=n)
e=n-1;
k=s;
i=s;
j=s+l;
while(i<s+l&&j<=e)
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<s+l)
b[k++]=a[i++];
while(j<=e)
b[k++]=a[j++];
s=e+1;
}
if(s<n)
{
for(;s<n;s++)
{
b[s]=a[s];
}
}
}
void MergeSort(int a[],int n)
{
int *p;
int h,l,f;
f=0;
l=1;
if(!(p=(int *)malloc(sizeof(int)*n)))
{
printf("内存分配失败!\n");
exit(0);
}
while(l<n)
{
if(f==1)
MergeOne(p,a,n,l);
else
MergeOne(a,p,n,l);
l=l*2;
f=1-f;
}
if(f)
{
for(h=0;h<n;h++)
a[h]=p[h];
}
free(p);
}
int main()
{
int i;
int shuzu[SIZE];
srand(time(NULL));
for(i=0;i<SIZE;i++)
shuzu[i]=rand()/1000+100;
printf("排序后的数组为:\n");
for(i=0;i<SIZE;i++)
printf("%d ",shuzu[i]);
printf("\n");
MergeSort(shuzu,SIZE);
printf("排序后的数组为:\n");
for(i=0;i<SIZE;i++)
printf("%d ",shuzu[i]);
printf("\n");
return 0;
}