[算法]-归并排序
核心原理:归并排序是对分治思想的一种应用,通过将一个序列划分成2个有序的子序列,然后合并起来既是排序的结果。那要如何获得有序的子序列了?递归调用自身,将子序列一直拆分成元素只有1个的程度再向上回归,即可得到有序的子序列;
特点:时间复杂度O(nlongn),空间复杂度 O(n),稳定
下面贴一下分治法的解题步骤:
a.分解原问题为若干个子问题,这些子问题是原问题的规模较小的实例;
b. 解决这些子问题,递归地求解各子问题的规模足够小,则直接求解;
c. 合并这些子问题的解 成 原问题的解。
归并排序,c语言:
1 #include <stdio.h> 2 // time.h是用来统计执行时间的,可以去掉; 3 #include <time.h> 4 5 void merge(int arry[],int start,int half,int size){ 6 int left[half]; 7 int right[size-half]; 8 9 for(int l=0;l<half;l++){ 10 left[l]=arry[l]; 11 } 12 13 for(int r=0;r<size-half;r++){ 14 right[r]=arry[half+r]; 15 } 16 17 int t=half; 18 for(int i=0;i<size ;i++){ 19 if(start<half && t<size ){ 20 if(left[start] < right[t-half]){ 21 arry[i]=left[start]; 22 start++; 23 } else{ 24 arry[i]=right[t-half]; 25 t++; 26 } 27 28 // 左边序列遍历完 29 } else if( start >= half && t<size ){ 30 arry[i]=right[t-half]; 31 t++; 32 33 // 右边序列遍历完 34 } else if(start < half && t >= size){ 35 arry[i]=left[start]; 36 start++; 37 } 38 } 39 } 40 41 // 归并排序 42 void merge_sort(int arry[],int size){ 43 if(!arry || size < 2){ 44 return; 45 } 46 // j是左边子序列的index,k是右边子序列的index 47 int k=size/2; 48 merge_sort(arry,k); 49 merge_sort(&arry[k],size-k); 50 merge(arry,0,k,size); 51 52 }