分治法之合并排序(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 }

 

posted @ 2013-10-01 10:21  诗宝smile  阅读(675)  评论(0编辑  收藏  举报