数据结构与算法 | 归并排序
归并排序(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)
利用了一个临时数组
数据结构与算法 | 归并排序相关推荐
- 数据结构与算法:归并排序
使用递归或循环实现归并排序 public class MergeSort {public static void mergesort(int[] arr){process(arr,0,arr.leng ...
- Python 数据结构与算法——归并排序
排序--归并排序 上文的 Python 实现还是稍显啰嗦,未能充分发挥 Python 语言的优势,以及"Python--一种可执行的伪代码"的论断.本文介绍一种更为简洁的归并排序的 ...
- 数据结构与算法之归并排序
数据结构与算法之归并排序 目录: 归并排序介绍 归并排序思想示意图 代码实现 1. 归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-a ...
- 数据结构和算法之排序一:归并排序
我们不得不承认一个事实,java学习过程中如果我们掌握了各种编程手段和工具,确实可以做一些开发,这就是一些培训机构敢告诉你几个月就能掌握一门语言的原因.但是随着时间的发展,我们总会感觉,这一类人如果不 ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- 数据结构与算法XS班-左程云第八节课笔记(归并排序和快速排序)
第8节 归并排序和快速排序 ##这是数据结构与算法新手班-左程云第八节课的笔记## 归并排序 归并排序实际上是一个很经典的排序方法,时间复杂度o(N*logN). 递归版本(图解排序算法(四)之归并排 ...
- 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数
本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...
- 资料分享:送你一本《数据结构与算法JavaScript描述》电子书!
数据结构 是掌握计算机编程必须具备的技能.通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表.栈.队列.字符串.动态数字.整数集合.树.图.搜索.排序等涉及的算法全部写一遍. ...
- 数据结构与算法的八股文自述(持续更新)
数据结构与算法的八股文自述 1.1 排序算法 冒泡排序: 冒泡排序只会操作相邻的两个数据.每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求.如果不满足就让它俩互换.一次冒泡会让至少一个 ...
最新文章
- “Duke选择大奖”荟萃2009最具创新的Java技术应用
- [BZOJ1068/Luogu2470][SCOI2007]压缩
- Nginx 多进程连接请求/事件分发流程分析
- 黑色自适应简约个人主页引导页HTML源码
- 四川方言说唱《管我锤子事》
- jtopo绘图帧数与cpu使用率
- 用计算机实现工业自动化,计算机技术在工业自动化控制系统中的应用
- 0.618 与 1.414
- Java文件编译的两种方式以及在SpringMVC传参中带来的问题
- 基本入门的C/C++算法总结
- 开务正式加入中国信通院数据库应用创新实验室
- 《Mybatis 手撸专栏》第10章:使用策略模式,调用参数处理器
- 10本深入学习Spring框架的最佳书籍和课程
- zktime 协议_zktime5.0考勤管理系统使用说明书(1.0版).pdf
- 计算机网络实验三:使用网络协议分析器捕捉和分析协议数据包
- java游戏繁体字名字,繁体字游戏名字你知道有几个?
- model.compile
- paddleocr cpp_infer 操作说明
- 常用jquery方法 总结
- js日历(包含农历节假日)