排序之归并排序

 1 /*
 2 排序 之 归并排序
 3 T(n) = O(nlogn)
 4 通过分治思想,将数组不断二分
 5 最后通过合并两组数据(合并数据时间复杂度为O(n))递归实现排序
 6 不论什么情况,时间复杂度都为O(nlogn)
 7 但是注意付出了开辟空间(t[maxn])的代价
 8  */
 9 #include <iostream>
10 using namespace std;
11 const int maxn = 5;
12 int a[maxn] = {5, 4, 3, 2, 1},t[maxn];
13 void merge(int a[], int l, int m, int r)//合并a[l,m]和a[m+1,r]这两组数据
14 {
15     int i = l, j = m + 1, x = m, y = r, k = 0;
16     while(i <= x && j <= y)//当a[l,m]或者a[m+1,r]任意一组填完退出
17         if(a[i] < a[j]) t[k++] = a[i++];
18         else t[k++] = a[j++];
19     while(i <= x) t[k++] = a[i++];//剩下的都是比前面大的,直接填
20     while(j <= y) t[k++] = a[j++];
21     for(int i = 0; i < k; ++i)//将排好序的数覆盖原来位置
22         a[l+i] = t[i];
23 }
24 void merge_sort(int a[],int l,int r)
25 {
26     if(l >= r) return;
27     int m = (l+r)/2;
28     merge_sort(a,l,m);//排序左半边
29     merge_sort(a,m+1,r);//排序右半边
30     merge(a,l,m,r);//合并两组数据
31 }
32 void print()
33 {
34     for(int i = 0; i < maxn; ++i)
35         cout << a[i] << " ";
36     cout << endl;
37 }
38 int main()
39 {
40     print();
41     merge_sort(a,0,maxn-1);
42     print();
43     return 0;
44 }

 

posted @ 2017-08-03 22:07  Posase  阅读(131)  评论(0编辑  收藏  举报