MergeSort(归并排序)原理及C++代码实现
归并排序利用分治策略进行排序。原理如下
分解:分解待排的n个元素的序列成个具n/2个元素的两个子序列。
解决:使用归并排序递归地排序两个子序列。
合并:合并两个已排序的子序列以产生已排序的答案。
归并排序的时间复杂度是θ(nlgn)。
归并排序是稳定排序之一。
归并排序不是原址排序,在合并阶段需要申请额外的数组空间。
代码如下:(仅供参考)
void MergeSort(int * const begin, int * const end) {
if (begin + >= end)
return ;
int m = (end - begin) / ;
MergeSort(begin, begin + m);
MergeSort(begin + m, end);
Merge(begin, begin + m, end);
}
//不使用哨兵的版本,需判断边界条件
void Merge(int * const first, int * const mid, int * const last) {
vector<int> left(first, mid);
vector<int> right(mid, last); int i = , j = , k = ;
while (i != left.size() && j != right.size()) {
if (left[i] <= right[j]) {
*(first + k) = left[i++];
} else {
*(first + k) = right[j++];
}
++k;
}
while (i != left.size()) {
*(first + k) = left[i++];
++k;
}
while (j != right.size()) {
*(first + k) = right[j++];
++k;
}
}
//使用哨兵来简化代码
void Merge(int * const first, int * const mid, int * const last) {
vector<int> left(first, mid);
vector<int> right(mid, last);
left.push_back(INT_MAX); //哨兵INT_MAX必须总是比较中的较大者
right.push_back(INT_MAX); //即待排序的值必须比INT_MAX小 int i = , j = ;
for (int k = ; k < last - first; ++k) {
if (left[i] <= right[j]) {
*(first + k) = left[i++];
} else {
*(first + k) = right[j++];
}
}
}
MergeSort(归并排序)原理及C++代码实现的更多相关文章
- 常见排序算法原理及JS代码实现
目录 数组 sort() 方法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序 创建时间:2020-08-07 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的 ...
- 编译原理-词法分析04-NFA & 代码实现
编译原理-词法分析04-NFA & 代码实现 0.术语 NFA 非确定性有穷自动机nondeterministic finite automation. ε-转换ε-transition 是无 ...
- 最短路径A*算法原理及java代码实现(看不懂是我的失败)
算法仅仅要懂原理了,代码都是小问题,先看以下理论,尤其是红色标注的(要源代码请留下邮箱,有測试用例,直接执行就可以) A*算法 百度上的解释: A*[1](A-Star)算法是一种静态路网中求解最短路 ...
- MergeSort 归并排序(java)
MergeSort 归并排序 排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素 2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1 3,子列元素个数为 ...
- Merge-Sort(归并排序)
Merge-Sort(归并排序) 思想 利用分治的思想,具体实现也就是递归,不断的将问题话分为更小的子问题,当子问题中规模为1的时候,认为数组已经有序了,然后再将子问题求得的结果不断的合并.也就是将长 ...
- 对象部分初始化:原理以及验证代码(双重检查锁与volatile相关)
对象部分初始化:原理以及验证代码(双重检查锁与volatile相关) 对象部分初始化被称为 Partially initialized objects / Partially constructed ...
- MergeSort归并排序和利用归并排序计算出数组中的逆序对
首先先上LeetCode今天的每日一题(面试题51. 数组中的逆序对): 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. ...
- 【C/C++】two pointers/归并排序/原理/理解/实现/算法笔记4.6
1.two pointers 思路:对序列进行扫描的时候,根据序列本身的特性用两个下标i和j对序列进行扫描,从而降低算法复杂度. ·例1 在递增序列中找a + b = M while (i<j) ...
- 【算法】(查找你附近的人) GeoHash核心原理解析及代码实现
本文地址 原文地址 分享提纲: 0. 引子 1. 感性认识GeoHash 2. GeoHash算法的步骤 3. GeoHash Base32编码长度与精度 4. GeoHash算法 5. 使用注意点( ...
随机推荐
- CF #610Div2 B2.K for the Price of One (Hard Version) (dp解法 && 贪心解法)
原题链接:http://codeforces.com/contest/1282/problem/B2题目大意:刚开始有 p 块钱,商店有 n 件物品,你每次可以只买一件付那一件的钱,也可以买 k 件只 ...
- 【每日Scrum】第三天冲刺
一.计划会议内容 登录和个人主界面开发布局实现. 二.任务看板 三.scrum讨论照片 四.产品的状态 登录与个人界面布局实现 五.任务燃尽图
- UVALive 3942 字典树+dp
其实主要是想学一下字典树的写法,但这个题目又涉及到了DP:这个题目要求某些单词组成一个长子串的各种组合总数,数据量大,单纯枚举复杂度高,首先肯定是要把各个单词给建成字典树,但是之后该怎么推一时没想到. ...
- python笔记(很乱)、打算抽个时间再好好整理
最近刚开始学python.总结的可能不是很好 print:打印值 input:可以进行等候赋值.进行一个交互 python中 需要两个==才为判断 变量:数字.字母.下划线组成 类型:int整数.st ...
- Linux--shell 计算时间差
参考:https://www.cnblogs.com/leixingzhi7/p/6281675.html starttime=`date +'%Y-%m-%d %H:%M:%S'` #执行程序 en ...
- thinkCMF图片上传选择已上传图片
1.找到上传图片的模板页面 webuploader.html 在上传文件标签后面 添加 <li class=""><a href="#explorer& ...
- ubuntu14.10安装gitlab
1 换源: # curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/ ...
- MacOS最佳思维导图推荐-MindNode 7
思维导图软件哪个比较好呢?MindNode for mac下载一款功能简单,界面简洁,不用看教程都会用的思维导图软件.mindnode 7 mac版可随时随地记录自己的想法,让您从灵感入手,将奇思妙想 ...
- 65)STL中string的知识
1)代码展示: string是一个类,只不过封装了 char* 而且还封装了 很多的字符串操作函数 2)string类的初始化: string的构造函数 ² 默认构造函数: string(); ...
- 【网易官方】极客战记(codecombat)攻略-森林-盐碱地salted-earth
保卫森林定居点开始. 简介 这个关卡引入了布尔 “or” 的概念. 在两个布尔值之间放置一个 or 将返回一个布尔值,就像 + 需要 2 个数字并且吐出另一个数字一样. 如果前或后的值为 true,则 ...