归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

归并排序的核心思路就是不断将数据拆分成左右两部分子序列,直到所有子序列有序,然后将有序的子序列不断合并成有序的序列, 最后整体有序

它和快速排序一样都呈树状结构, 所以我们都采用分治递归来实现。
下面看图

还是我们一直用的数据

int arr[10] = { 46, 74, 53, 14, 26, 36, 86, 65, 27, 34 };


首先我们将数据不断拆分,直到子序列有序, 然后将所以有序的子序列逐一合并


红色为刚合并的序列


这就是归并拆分和合并的思路。

下面开始代码实现

//两两归并
void merge(vector<int>& vec, int begin, int mid, int end)
{vector<int> temp(end - begin + 1);int begin1 = begin, begin2 = mid + 1;int end1 = mid, end2 = end;int i = 0;while (begin1 <= end1 && begin2 <= end2){if (vec[begin1] < vec[begin2]){temp[i++] = vec[begin1++];}else{temp[i++] = vec[begin2++];}}while (begin1 <= end1){temp[i++] = vec[begin1++];}while (begin2 <= end2){temp[i++] = vec[begin2++];}for (int i = 0; i < temp.size(); i++){vec[i + begin] = temp[i];}
}//递归,将区间划分左右两部分,直到每个区间只剩下一个元素后开始归并
void _mergeSort(vector<int>& vec, int begin, int end)
{if (begin >= end){return;}int mid = (end - begin) / 2 + begin;_mergeSort(vec, begin, mid);_mergeSort(vec, mid + 1, end);merge(vec, begin, mid, end);    //归并
}//设置步长,即每次归并的区间大小。一开始先两两归并,然后四个,八个......,每次归并的都是相邻区间
void _mergeSort2(vector<int>& vec, int begin, int end)
{//设置区间大小for (int gap = 1; gap < vec.size(); gap *= 2){//归并相邻区间for (int begin = 0; begin < vec.size(); begin += 2 * gap){int mid = begin + gap;int end = begin + 2 * gap;if (mid > vec.size()){mid = vec.size();}if (end > vec.size()){end = vec.size();}merge(vec, begin, mid - 1, end - 1);    //右边是开区间,需要减一}}
}

归并时间复杂度:平均 O(nlogn) 最坏 O(nlogn) 平均O(nlogn)
空间复杂度:O(n)
利用了一个临时数组

数据结构与算法 | 归并排序相关推荐

  1. 数据结构与算法:归并排序

    使用递归或循环实现归并排序 public class MergeSort {public static void mergesort(int[] arr){process(arr,0,arr.leng ...

  2. Python 数据结构与算法——归并排序

    排序--归并排序 上文的 Python 实现还是稍显啰嗦,未能充分发挥 Python 语言的优势,以及"Python--一种可执行的伪代码"的论断.本文介绍一种更为简洁的归并排序的 ...

  3. 数据结构与算法之归并排序

    数据结构与算法之归并排序 目录: 归并排序介绍 归并排序思想示意图 代码实现 1. 归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-a ...

  4. 数据结构和算法之排序一:归并排序

    我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因.但是随着时间的发展,我们总会感觉,这一类人如果不 ...

  5. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

  6. 数据结构与算法XS班-左程云第八节课笔记(归并排序和快速排序)

    第8节 归并排序和快速排序 ##这是数据结构与算法新手班-左程云第八节课的笔记## 归并排序 归并排序实际上是一个很经典的排序方法,时间复杂度o(N*logN). 递归版本(图解排序算法(四)之归并排 ...

  7. 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数

    本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...

  8. 资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

    数据结构 是掌握计算机编程必须具备的技能.通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表.栈.队列.字符串.动态数字.整数集合.树.图.搜索.排序等涉及的算法全部写一遍. ...

  9. 数据结构与算法的八股文自述(持续更新)

    数据结构与算法的八股文自述 1.1 排序算法 冒泡排序: 冒泡排序只会操作相邻的两个数据.每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求.如果不满足就让它俩互换.一次冒泡会让至少一个 ...

最新文章

  1. “Duke选择大奖”荟萃2009最具创新的Java技术应用
  2. [BZOJ1068/Luogu2470][SCOI2007]压缩
  3. Nginx 多进程连接请求/事件分发流程分析
  4. 黑色自适应简约个人主页引导页HTML源码
  5. 四川方言说唱《管我锤子事》
  6. jtopo绘图帧数与cpu使用率
  7. 用计算机实现工业自动化,计算机技术在工业自动化控制系统中的应用
  8. 0.618 与 1.414
  9. Java文件编译的两种方式以及在SpringMVC传参中带来的问题
  10. 基本入门的C/C++算法总结
  11. 开务正式加入中国信通院数据库应用创新实验室
  12. 《Mybatis 手撸专栏》第10章:使用策略模式,调用参数处理器
  13. 10本深入学习Spring框架的最佳书籍和课程
  14. zktime 协议_zktime5.0考勤管理系统使用说明书(1.0版).pdf
  15. 计算机网络实验三:使用网络协议分析器捕捉和分析协议数据包
  16. java游戏繁体字名字,繁体字游戏名字你知道有几个?
  17. model.compile
  18. paddleocr cpp_infer 操作说明
  19. 常用jquery方法 总结
  20. js日历(包含农历节假日)

热门文章

  1. 字典-变量的定义以及应用场景
  2. Spring Session实战
  3. SpringCloud:Zuul 路由访问(基本使用、路由功能、过滤访问、服务降级)
  4. 元素的选中问题 元素选中的问题 切换复选框选中 全选和全不选
  5. oracle删除建分区索引,Oracle分区表之创建维护分区表索引的详细步骤
  6. Linux文件系统和文本编辑器
  7. 树莓派3 mysql端口_树莓派3 之 安装Mysql服务
  8. linux环境下zookeeper部署
  9. shaderlab UV动画所需的变量声明
  10. 8587520在51CTO【礼树迎蛇 红满社区】