引言在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 */ |
简单算法-排序-归并排序
猜你喜欢
转载自www.cnblogs.com/123zhh-helloworld/p/9090720.html
今日推荐
周排行