二路归并排序
思路:采用分治思想,把需要排序的数组分为两个部分,再将这两个部分进行合并。
适合分治的情形,大问题可以分割成小问题,所有的问题处理方式都相同。
排序过程如下,方便你了解递归的过程
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)