二路归并排序

思路:采用分治思想,把需要排序的数组分为两个部分,再将这两个部分进行合并。

适合分治的情形,大问题可以分割成小问题,所有的问题处理方式都相同。

排序过程如下,方便你了解递归的过程

9 8 7 2 5 1 3

9 8 7 2 | 5 1 3

8 9 7 2 | 5 1 3

8 9 2 7 | 5 1 3

2 7 8 9 | 5 1 3

2 7 8 9 | 1 5 3

2 7 8 9 | 1 3 5

1 2 3 5 7 8 9

 1 void merge(vector<int> &a,int start,int middle,int end){
 2     vector<int> b,c;
 3     for(int i=0;i<=middle-start;++i){
 4         b.push_back(a[start+i]);
 5     }
 6     for(int j=0;j<end-middle;++j){
 7         c.push_back(a[j+middle+1]);
 8     }
 9     int aIndex=start,bIndex=0,cIndex=0;
10     while(bIndex<b.size()&&cIndex<c.size()){
11         if(b[bIndex]<=c[cIndex])
12             a[aIndex++]=b[bIndex++];
13         else 
14             a[aIndex++]=c[cIndex++];
15     }
16     while(bIndex<b.size()){
17         a[aIndex++]=b[bIndex++];
18     }
19     while(cIndex<c.size()){
20         a[aIndex++]=c[cIndex++];
21     }
22 }
23 
24 
25 void mergeSort(vector<int> &a,int start,int end){    
26     int middle;                             //如果你对分治的递归过程不是很理解,那就先采用整体的方式理解。分而治之。
27     if(start<end){
28         middle = (start+end)/2;
29         mergeSort(a,start,middle);
30         mergeSort(a,middle+1,end);
31         merge(a,start,middle,end);
32     }
33 }

时间复杂度:O(nlogn)

空间复杂度:O(n)

posted @ 2015-06-10 15:54  影翕  阅读(310)  评论(0编辑  收藏  举报