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; }