归并排序

 

运用分治法:

1.划分问题:把序列分成元素个数尽量相等的两半

2.递归求解:把两半元素分别排序

3.合并问题:把两个有序表合并成一个

时间复杂度:T(n) = 2T(n/2) + 2n  -----> O(nlogn)

 

 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 }
View Code

 

posted @ 2017-08-18 11:40  chsobin  阅读(144)  评论(0编辑  收藏  举报