/*============================================================================= # # 分治为子序列 # 归并排序 # # =============================================================================*/ #include <stdio.h> #include <time.h> #include <malloc.h> int arr[]={6, 3, 5, 7, 2, 4, 1, 8, 10, 9}; //把数组合并 void merg_array(int *a1,int len1,int *a2,int len2) { int i=0,j=0,k=0; int *arr_temp=(int *)malloc(sizeof(int)*(len1+len2)); while(i<len1&&j<len2) arr_temp[k++]=a1[i]<a2[j]? a1[i++]:a2[j++]; //a2已经为空,把a1中剩余的数搬到arr_temp中去就可以了 while(i<len1) arr_temp[k++]=a1[i++]; while(j<len2) arr_temp[k++]=a2[j++]; for(i=0,k=0;i<len1+len2;++i,++k) a1[i]=arr_temp[k]; free(arr_temp); } // void merg_sort(int *a,int len) { //结束条件 if(len<=1) return; int *a1,*a2,len1,len2; len1=len/2; len2=len-len1; a1=a; a2=a+len1; //分治调用 merg_sort(a1,len1); merg_sort(a2,len2); //分治结束,合并两个子数组 merg_array(a1,len1,a2,len2); } int main() { int len=sizeof(arr)/sizeof(arr[0]); merg_sort(arr,len); for(int i=0;i<len;++i) printf("%d ",arr[i]); return 0; }