简单算法-排序-归并排序

引言

  在C语言的教材中, 介绍了冒泡排序和选择排序等几种简单的排序。 操作简单, 容易理解,

但是时间复杂度却比较高。今天在这里介绍另一种简单排序 -归并排序, 听起来就有B格。

优点

  归并排序的优点简单来讲就是稳稳的快。

  首先归并排序的时间复杂度是n*log(n), 比起n^2的冒泡排序快乐不少, 其次它稳定,

快排的时间复杂度也是n*log(n),但是当数组完全逆序的情况下, 快排的时间复杂度就会和

冒泡排序一样变成n^2了, 然而归并排序则是稳稳的n*log(n),而且我个人觉得归并排序好

理解一点。

原理

  归并排序的原理就是二分法, 分而治之。 大化小, 小化了。

代码

 1 #include<iostream>
 2 
 3 #define rep(i, a, n) for(int i = a; i < n; i++)
 4 #define res(i, a, n) for(int i = a - 1; i >= n; i--)
 5 using namespace std;
 6 const int N = 10020;
 7 
 8 template<class T>       //这个是模板, 很强大的东西
 9 void MergeSort(T *l, T *m, T *r){       
10     T *x = l, *y = m;
11     int len = r - l;
12     T *a = new T[len + 5], index = 0;
13 /**************************************************/
14 /**/while(x < m && y < r){                      /**/
15 /**/if(*x < *y)     a[index++] = *(x++);        /**/
16 /**/    else            a[index++] = *(y++);    /**/
17 /**/}                                           /**/
18 /**/                                            /**/
19 /**/while(x < m)        a[index++] = *(x++);    /**/
20 /**/while(y < r)        a[index++] = *(y++);    /**/
21 /**************************************************/
22     /*以上这段代码的思路, 说的简单的就是, 一次遍历排好序*/
23     /*比如说当传进来的数组为{2, 3, 1, 4}的时候就会排成{1, 2, 3, 4}*/
24     /*因为1 < 2, 所以先放1, 然后2 < 4, 再放2, 3 < 4, 放3, 然后退出第一个循环, 在第三个循环里面放4, 然后就排好了*/
25     /*但是, 如果数组是{3, 2, 4, 1}的时候就会排成{3, 2, 4, 1}, 没有变化, 就不会得到我们想要的功能*/
26     /*然而并不会出现这种情况, 因为我们会先把{3, 2}排成{2, 3}, {4, 1}排成{1, 4}*/
27     /*这就是分治的nb之处了*/
28 
29     rep(i, 0, index)    l[i] = a[i];
30     /*然后把原数组局部覆盖就好了*/
31 }
32 
33 template<class T>
34 void sort(T *l, T *r){//首先取名字一定要有B格, 我不加algorithm头文件, 但我依旧可以用sort, 而且还是绿色, 这就很有B格
35     T *m = l + (r - l) / 2;
36     if(r - l > 1){
37         sort(l, m);     //每次都分成两部分, 大化小
38         sort(m, r);     //当r - l <= 1 的时候, 即足够小的时候, 就不分了, 小化了
39     }
40     MergeSort(l, m, r); //sort体现的是分治的思想, MergeSort则是操作
41 }
42 
43 int main(){
44     int n;
45     char a[N];
46     while(cin >> n){
47         rep(i, 0, n)    cin >> a[i];
48         sort(a, a + n);
49         rep(i, 0, n)    cout << a[i] << " ";      cout << endl;
50     }
51     return 0;
52 }
53 
54 /*
55 10
56 1 6 2 7 5 3 1 2 4 1
57 
58 10
59 1627531241
60 
61 8
62 德玛西亚
63 
64 */
65 
66 /*
67 给了几组数据, 第三组理所当然会出现问题
68 */
View Code

转载于:https://www.cnblogs.com/123zhh-helloworld/p/9090720.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值