分治法之合并排序(Merge Sort)
结构上递归的算法一般采用分治法(分解,递归解决,合并)
分治排序第一步——“分”,第二部——“合”,时间复杂度为O(N logN),因为分治后的高度为logN,每次比较都要进行N次。但是它需要和数组一样规模的额外空间,而非原地排序。
1 void mergeSort(int A[],int tmp[],int begin,int end){ 2 if((end-begin)>0){ 3 int mid=begin+(end-begin)/2; 4 mergeSort(A,tmp,begin,mid); 5 mergeSort(A,tmp,mid+1,end); 6 merge(A,tmp,begin,mid+1,end); 7 } 8 }
mergeSort函数的作用就是将序列分解至长度为1,再执行merge函数,合并已排序序列:
left(i) | right (j) |
end |
1 void merge(int A[],int tmp[],int left,int right,int end){ 2 int i=left;int j=right; 3 int m=left; 4 while(i<right&&j<=end){ 5 if(A[i]<A[j]){ 6 tmp[left++]=A[i]; 7 i++; 8 } 9 if(A[i]>=A[j]){ 10 tmp[left++]=A[j]; 11 j++; 12 } 13 14 } 15 if(i==right){ 16 while(j<=end){ 17 tmp[left++]=A[j++]; 18 } 19 } 20 if(j>end){ 21 while(i<right){ 22 tmp[left++]=A[i++]; 23 } 24 } 25 for(;m<=end;m++){ 26 A[m]=tmp[m]; 27 } 28 }