归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表.

归并排序(merge sort)的时间复杂度是O(nlogn), 实际效果不如快速排序(quick sort)和堆排序(heap sort),

但是归并排序是稳定排序, 而快速排序和堆排序则不是.

代码:

  1. /*
  2. * main.cpp
  3. *
  4. *  Created on: 2014.6.12
  5. *      Author: Spike
  6. */
  7. /*eclipse cdt, gcc 4.8.1*/
  8. #include <iostream>
  9. #include <algorithm>
  10. #include <iterator>
  11. using namespace std;
  12. /*参数: SR-输入数组, TR-输出数组, i至m:第一段有序, m+1至n:第二段有序*/
  13. void Merge (const std::vector<int> SR, std::vector<int>& TR, int i, int m, int n)
  14. {
  15. int j , k;
  16. for (j=m+1, k=i; i<=m && j<=n; ++k) {
  17. if (SR[i] < SR[j])
  18. TR[k] = SR[i++];
  19. else
  20. TR[k] = SR[j++];
  21. }
  22. if (i<=m)
  23. std::copy((SR.begin()+i), (SR.begin()+m+1), TR.begin()+k);
  24. if (j<=n)
  25. std::copy((SR.begin()+j), (SR.begin()+n+1), TR.begin()+k);
  26. }
  27. /*参数: SR-输入数组, TR-输出数组, s:起始, t:末尾*/
  28. void MSort (const std::vector<int> SR, std::vector<int>& TR, int s, int t)
  29. {
  30. std::vector<int> tempTR(SR.size());
  31. if (s == t)
  32. TR[s] = SR[s];
  33. else {
  34. int m = (s+t)/2; //平分SR, SR[s..m]和SR[m+1..t]
  35. MSort(SR, tempTR, s, m); //前半段
  36. MSort(SR, tempTR, m+1, t); //后半段
  37. Merge(tempTR, TR, s, m, t); //排序
  38. //copy(TR.begin(), TR.end(), ostream_iterator<int>(cout, " "));
  39. //std::cout << std::endl;
  40. }
  41. }
  42. void MergeSort (std::vector<int>& L) {
  43. MSort(L, L, 0, L.size()-1);
  44. }
  45. int main (void)
  46. {
  47. std::vector<int> L = {49, 38, 65, 97, 76, 13, 27, 49};
  48. MergeSort(L);
  49. copy(L.begin(), L.end(), ostream_iterator<int>(cout, " "));
  50. std::cout << std::endl;
  51. return 0;
  52. }

输出:

    1. 13 27 38 49 49 65 76 97

数据结构 - 归并排序(merging sort)的更多相关文章

  1. 数据结构 - 归并排序(merging sort) 具体解释 及 代码

    归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...

  2. 归并排序(Merging Sort)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. 小小c#算法题 - 8 - 归并排序 (Merging Sort)

    “归并”的含义是将两个或两个以上的有序序列组合成一个新的有序序列.这个“归并”可以在O(n+m)的数量级上实现,但这同时也需要O(n+m)的空间复杂度.具体为:首先分配一个新的长度为n+m的空序列,然 ...

  4. FZU 1919 -- K-way Merging sort(记忆化搜索)

    题目链接 Problem Description As we all known, merge sort is an O(nlogn) comparison-based sorting algorit ...

  5. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  6. 算法与数据结构基础 - 排序(Sort)

    排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...

  7. 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)

    连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...

  8. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...

  9. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

随机推荐

  1. SQL——字符串处理函数

    1) ASCII Format:ASCII ( character_expression ) Function:返回表达式最左端字符的ASCII值. eg: select ASCII('abcdef' ...

  2. javascript中对象函数继承的概念

    什么是函数对象?这个对象既是通常意义上的对象,又可以加上括号直接执行的函数. 产生函数对象的方式有两种:1.通过function关键字产生:var fn = function(){};2.实例化Fun ...

  3. java集合练习——题目

    2.已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷 ...

  4. Axios、Lodash、TweenJS

    Axios是一个基于promise的HTTP库 http://chuansong.me/n/394228451820 Lodash是一个JavaScript的函数工具集 http://www.css8 ...

  5. 阿里云产品介绍(三):云数据库RDS

    写完云服务器ECS,本来想先写负载均衡的. 因为发现很多客户,都是直接将单台云服务器应用对外提供访问,如果云服务器宕机,应用就会停止服务.云服务器标称有99.95%的可用率,一年下来宕机四个多小时也是 ...

  6. 微信、陌陌等著名IM软件设计架构详解

    对微信.陌陌等进行了分析,发出来分享一下(时间有些久了) 电量:对于移动设备最大的瓶颈就是电量了.因为用户不可能随时携带电源,充电宝.所以必须考虑到电量问题.那就要检查我们工程是不是有后台运行,心跳包 ...

  7. drupal7安装中文错误

    安装中文错误 星期四, 07/04/2013 - 15:06 — tao_3000 更多0 An AJAX HTTP error occurred. HTTP Result Code: 200 Deb ...

  8. OpenSSL命令---pkcs7

    用途: 用于处理DER或者PEM格式的pkcs#7文件. 用法: openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in filename] [ ...

  9. Folder Recursion with C#

    by Richard Carr, published at http://www.blackwasp.co.uk/FolderRecursion.aspx Some applications must ...

  10. 频域分辨率与DFT,DCT,MDCT理解

    搞了这么久音频算法,有些细节还没有很清楚. 比如DFT和DCT有哪些区别,DFT系数为什么会是对称的,同样帧长的数据,各自的频域分辨率是多少? 今天决定搞清楚这些问题, 首先DFT的系数对称(2N点的 ...