将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。
之后,将A,B组各自再分成二组。
依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
#include<stdio.h> #include<stdlib.h> void GuiBing(int a[],int first,int mid,int last,int c[]) { int i=first; int j=mid+1; int m=mid; int n=last; int k=0; while((i<=m)&&(j<=n)) { if(a[i]<=a[j]) c[k++]=a[i++]; else c[k++]=a[j++]; } while(i<=m) c[k++]=a[i++]; while(j<=n) c[k++]=a[j++]; for(int l=0;l<k;l++) a[first+l]=c[l]; } void Divide(int a[],int first,int last,int c[]) { if(first<last) { int mid=(first+last)/2; Divide(a,first,mid,c); Divide(a,mid+1,last,c); GuiBing(a,first,mid,last,c); } } int main() { int paixu[]={10,54,2,59,6,325,489,0,266,12,32,88}; int temp[12]; Divide(paixu,0,11,temp); for(int i=0;i<12;i++) printf("%d,",temp[i]); return 0; }
参考:
https://blog.csdn.net/morewindows/article/details/6678165