C++排序算法之归并排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;/*该函数将数组下标范围[l1,r1]和[l2,r2]的有序序列合并成一个有序序列*/
void merge(vector<int>& nums, int l1, int r1, int l2, int r2 ) {int i = l1; //左半部分起始位置int j = l2; //右半部分起始位置int n = (r1 - l1 + 1) + (r2 - l2 + 1); //要合并的元素个数vector<int> temp(n); //辅助数组int k = 0; //辅助数组其起始位置while (i <= r1&&j <= r2) { //挑选两部分中最小的元素放入辅助数组中if (nums[i] < nums[j])temp[k++] = nums[i++];elsetemp[k++] = nums[j++];}//如果还有剩余,直接放入到辅助数组中while (i <= r1)temp[k++] = nums[i++];while (j <= r2)temp[k++] = nums[j++];//更新原始数组元素for (int i = 0; i < n;i++){nums[l1 + i] = temp[i];}
}/*二路归并排序(递归实现)*/
void MergeSort(vector<int>& nums,int start, int end) {if (start < end) {int mid = (start + end) >> 1; //分割序列MergeSort(nums, start, mid); //对序列左半部分进行规并排序MergeSort(nums, mid + 1, end); //对序列右半部分进行规并排序merge(nums, start, mid, mid + 1, end); //合并已经有序的两个序列}
}/*二路归并排序(迭代实现)*/
void MergeSort1(vector<int>& nums, int start, int end)
{int n = nums.size();if (start < end) {//step为组内元素个数,step/2为左子区间元素个数for (int step = 2; step/2 <n; step *= 2) {//每step个元素一组,组内前step/2和后step/2个元素进行合并for (int i = 0; i < n; i += step) {int mid = i + step / 2 - 1; //左子区间元素个数为step/2if(mid+1<n) //右子区间存在元素个数则合并//左子区间为[i,mid],右子区间为[mid+1, min(i+step-1, n-1)]merge(nums, i, mid, mid + 1, min(i + step - 1, n-1));}}}
}int main() {vector<int> nums{ 1,4,3,2,5,6,3 };MergeSort(nums,0,6);
// MergeSort1(nums, 0, 6);for (auto x : nums)cout << x << " ";cout << endl;return 0;
}
运行结果如下
C++排序算法之归并排序相关推荐
- 排序算法:归并排序、快速排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...
- 排序算法之--归并排序(好玩的一个算法o。o)快速入门
排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...
- NOI提高级:排序算法之归并排序、快速排序
图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- [Alg]排序算法之归并排序
[Alg]排序算法之归并排序 作者:屎壳郎 miaosg01@163.com 日期:Aug 2021 版次:初版 简介: 归并排序是一类在任何情况下都能保证Nlg(N)N\lg(N)Nlg(N)的排 ...
- 【排序算法】归并排序(C语言)
[排序算法]-- 归并排序(C语言) 目录 一.归并排序的原理 二.两个有序数组排序和合并 1. 原地排序 2. 创建临时空间 二.递归实现 三.非递归实现 1. 实现思路 2. 数组边界问题 3. ...
- 排序算法中——归并排序和快速排序
冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...
- 【DS】排序算法之归并排序(Merge Sort)
一.算法思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用,指的是将两个已经排序的序列合并成一个序列的操作.其归并思想如下: 1)申请空间,使其大小为两个已经 ...
- c语言归并排序代码详细注释,C语言实现排序算法之归并排序详解
排序算法中的归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件. 一.实现原理: 1.算法基本思路 设两个有序的子文件 ...
- 排序算法-07归并排序(python实现)
归并排序 概述 以归并操作为基础的排序算法,底层算法设计为分治法. 所谓分治法,就是讲问题分解为多个子问题递归求解,再将子问题答案合并. 算法实现 将待排序序列分解为两个,四个,,,n个子部分. 两两 ...
最新文章
- 结构感知图像修复:ICCV2019论文解析
- 数据千万条,备份第一条,数据找不回,老板两行泪
- C++太难学,怎么破?这本书给你指点迷津!
- 清华大学人工智能研究院开源“天授”强化学习平台
- linux ip地址漂移,Linux 实现高可用性(HA) —之ip 漂移方法(vrrp)
- 现代软件工程系列 学生读后感 梦断代码 DTSlob (2)
- C语言-字符串处理函数strcmp
- (十)java多线程之CountDownLatch
- 如何更改Andrioid模拟器 avd路径
- extjs TabPanel 监听激活事件
- Java-----jar反编译修改重新打包
- MySQL常用语句总结
- ios开发之商城类软件 - 框架构思
- 十天学会单片机和c语言编程 ppt,十天学会单片机和C语言编程笔记1
- flex:1什么意思
- DS18B20 数字温度传感器的使用和基于RT-Thread操作系统的实现
- loopback接口介绍
- 中兴程序员跳楼事件始末解读
- 供参考的the-gan-zoo,列出的GAN相关模型和论文
- 晨风机器人安卓版_晨风qq机器人
热门文章
- 孩子发烧,别急着降温
- 光猫修改配置同步到服务器,光猫—防火墙—3台服务器防火墙需要怎么配置,防火墙做二层?...
- 安徽大学计算机学院高亮,计算机学院关于智能计算的大规模优化学术报告圆满结束...
- python使用Canny算法和HoughCiecle算法实现圆的检测与定位
- STM32F105 实现USB BULK传输
- 科普 | 抖音服务器带宽有多大,为什么能够供那么多人同时刷?
- python+opencv摄像头人脸检测+代码注释
- 根据目标检测结果裁剪bbox保存到本地,python,opencv
- 微信按钮翻译中英对照表
- dnf地下城虚拟机去虚拟化过鲁大师教程