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

 

转载于:https://www.cnblogs.com/scar-xd/p/3348284.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值