归并排序
运用分治法:
1.划分问题:把序列分成元素个数尽量相等的两半
2.递归求解:把两半元素分别排序
3.合并问题:把两个有序表合并成一个
时间复杂度:T(n) = 2T(n/2) + 2n -----> O(nlogn)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1000; 4 int a[maxn] = {5, 4, 8 , 6, 10}; //待排序的数组 5 int t[maxn]; //辅助数组 6 7 //归并排序 8 void merge_sort(int * A, int x, int y, int * T) //对区间[x, y)进行排序 9 { 10 if(y-x > 1) 11 { 12 int m = x + (y-x)/2; //划分 13 int p = x, q = m, i = x; 14 merge_sort(A, x, m, T); //递归求解 15 merge_sort(A, m, y, T); //递归求解 16 while(p<m || q<y) 17 { 18 if(q>=y || (p<m && A[p]<=A[q])) T[i++] = A[p++]; //从左半数组复制到临时空间 19 20 else T[i++] = A[q++]; //从右半数组复制到临时空间 21 } 22 for(i=x;i<y;++i) A[i] = T[i]; //从辅助空间复制回A数组 23 } 24 } 25 26 //测试 27 int main() 28 { 29 merge_sort(a, 0, 5, t); 30 for(int i=0;i<5;++i) 31 { 32 cout << a[i] << " "; 33 } 34 return 0; 35 }