归并排序(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. Nhibernate基础使用教程以及简易封装

    1.Nhibernate简介 NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技 ...

  2. Firefox SVG getBBox方法返回'NS_ERROR_FAILURE'错误分析

    在SVG中,我们无法给Text元素设置Width和Height属性,因此无法直接获取Text元素的高和宽.如果想要给Text元素添加背景色,最简单的办法就是在Text元素的下面添加Rect,然后给Re ...

  3. atitit.标准时间格式 互相转换 秒数 最佳实践

    atitit.标准时间格式 互相转换 秒数 最佳实践 例如00:01:19 转换为秒数  79,,and互相转换 一个思路是使用div 60 mod...不过麻烦的... 更好的方法是使用stamp ...

  4. paip.powerdesign cdm pdm文件 代码生成器 java web 页面 实现

    paip.powerdesign cdm pdm文件 代码生成器 java web 页面 实现 准备从pd cdm生成java web 页面...但是,ms无直接地生成软件.... 只好自己解析cdm ...

  5. XML入门级的简单学习

    xml案例<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>Ge ...

  6. PHP读取流文件

    $filepath = 'http://www.vip.com/down'; $fp = fopen($filepath,"r"); Header("Content-ty ...

  7. C# 串口操作 ---- 系列文章

    C# 串口操作系列(5)--通讯库雏形 通讯库雏形的建立. 串口通讯介绍的高级篇,介绍更高级的抽象,为扩展为通用的客户端通讯库做铺垫,扩展性的考虑,能支持任意类型的流设备. ... 2010-08-0 ...

  8. dubbo发布web服务实例

    dubbo角色与调用执行过程 dubbo节点角色说明:provider: 暴露服务的服务提供方consumer: 调用远程服务的服务消费方registry: 服务注册于发现的注册中心monitor: ...

  9. Codeforces Round #160 (Div. 1) 题解【ABCD】

    Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...

  10. python数据结构之二叉树遍历的实现

    本篇是实现二叉树的三种遍历,先序遍历,中序遍历,后序遍历 #!/usr/bin/python # -*- coding: utf-8 -*- class TreeNode(object): def _ ...