归并排序 图解 递归 + 非递归 + 笔记
前置知识:讲解019-算法笔试中处理输入和输出,讲解020-递归和master公式
- (1)左部分排好序,右部分排好序,利用merge过程让左右整体有序
- (2)merge过程:谁小拷贝谁,直到左右两部分所有的数字耗尽
- (3)递归实现和非递归实现
- (4)时间复杂度O(n*logn)
- (5)需要辅助数组,所以额外空间复杂度O(n)
- (6)归并排序为什么比O(n^2)的排序快?因为比较行为没有浪费!
- (7)利用归并排序的便利性可以解决很多问题,例如归并分治
注意:有些资料说可以用原地归并排序,把额外空间复杂度变成O(1),不要浪费时间去学。因为原地归并排序确实可以省空间,但是会把复杂度变成O(n^2)
- 对这个数组arr=[6,4,2,3,9,4] ,进行归并排序


- 挑其中一步来演示: 把[2,4,6]和[3,4,9]合并(merge)








最后再刷回原数组

void merge(vector<int>& arr,int left, int mid, int right) {int n = right - left + 1;vector<int> help(n,0);int i = 0;int a = left;int b = mid + 1;while (a <= mid && b <= right) {help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++];}// 左侧指针,右侧指针,必有一个越界,另一个不越界while (a <= mid) {help[i++] = arr[a++];}while (b <= right) {help[i++] = arr[b++];}for (i = 0; i <n; i++) { // 把 help 里面的数据重新刷回到原数组arrarr[i+left] = help[i];}
}
(1)归并排序递归版
// 递归方法
void mergeSort(vector<int>& arr, int left, int right) {if (left == right) return;int mid = (left + right) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);
}
(2)归并排序非递归版





// 归并排序非递归版
// 时间复杂度:O(n * logn)
// 空间复杂度:O(n)
void mergeSort2(vector<int>& arr) {int n = arr.size();// 一共发生O(logn)次for (int left, mid, right, step = 1; step < n; step <<= 1) {// 内部分组merge,时间复杂度:O(n)left = 0;while (left < n) {mid = left + step - 1;if (mid + 1 >= n) {// 已经没有右侧了break;}// 有右侧,求右侧的右边界right = min(left + (step << 1) - 1, n - 1);// left ... mid mid+1 ... right// left ... mid mid+1 ... right// left ... mid mid+1 ... rightmerge(arr,left, mid, right);left = right + 1;}}
}
完整代码:
#include <iostream>
#include <vector>
using namespace std;void merge(vector<int>& arr,int left, int mid, int right) {int n = right - left + 1;vector<int> help(n,0);int i = 0;int a = left;int b = mid + 1;while (a <= mid && b <= right) {help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++];}// 左侧指针,右侧指针,必有一个越界,另一个不越界while (a <= mid) {help[i++] = arr[a++];}while (b <= right) {help[i++] = arr[b++];}for (i = 0; i <n; i++) { // 把 help 里面的数据重新刷回到原数组arrarr[i+left] = help[i];}
}/*归并排序递归版假设left...right一共 n 个数T(n) = 2 * T(n/2) + O(n)a = 2,b = 2,c = 1根据master公式,时间复杂度:O(n * logn)空间复杂度:O(n)
*/
// 递归方法
void mergeSort(vector<int>& arr, int left, int right) {if (left == right) return;int mid = (left + right) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);
}// 归并排序非递归版
// 时间复杂度:O(n * logn)
// 空间复杂度:O(n)
void mergeSort2(vector<int>& arr) {int n = arr.size();// 一共发生O(logn)次for (int left, mid, right, step = 1; step < n; step <<= 1) {// 内部分组merge,时间复杂度:O(n)left = 0;while (left < n) {mid = left + step - 1;if (mid + 1 >= n) {// 已经没有右侧了break;}// 有右侧,求右侧的右边界right = min(left + (step << 1) - 1, n - 1);// left ... mid mid+1 ... right// left ... mid mid+1 ... right// left ... mid mid+1 ... rightmerge(arr,left, mid, right);left = right + 1;}}
}int main() {vector<int> arr = { 6,4,2,3,9,4};int n = arr.size();mergeSort(arr, 0, n - 1);//mergeSort2(arr);for (int i = 0; i < n; i++) {cout << " " << arr[i] << " " << endl;}system("pause");return 0;
}
完整图:

参考和推荐视频:
算法讲解021【必备】归并排序_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1wu411p7r7/?spm_id_from=333.999.list.card_archive.click&vd_source=a934d7fc6f47698a29dac90a922ba5a3
相关文章:
归并排序 图解 递归 + 非递归 + 笔记
前置知识:讲解019-算法笔试中处理输入和输出,讲解020-递归和master公式 (1)左部分排好序,右部分排好序,利用merge过程让左右整体有序(2)merge过程:谁小拷贝谁,直到左右两部分所有的数字耗尽(3)递归实现和非递归实现(4…...
2023 年最好的 Android 系统修复/刷机应用程序和软件
任何 Android 设备要顺利运行,其操作系统必须运行良好。幸运的是,对于大多数 Android 用户来说,这是不间断的。设备运行良好,打电话、共享文档等都没有问题。尽管如此,Android 操作系统可能会停止运行。这可能是由于特…...
Linux下内网穿透实现云原生观测分析工具的远程访问
📑前言 本文主要是Linux下内网穿透实现云原生观测分析工具的远程访问设置的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &…...
卡数据兼容性要求-M2M架构
EUM 应在生产 eUICC 过程中安装并初始化 ISD-R. eUICC 出厂后, ISD-R 应进入 GlobalPlatform Card Specification [GP CS]第 5.3 节中定义的生命周期状态 "PERSONALIZED". ISD-R 权力授予应遵循[GS RPT]附录 C 中的定义. EUM 应在 eUICC 生产过程中安装并…...
C++入门篇3(类和对象【重点】)
文章目录 C入门篇3(类和对象【重点】)1、面向过程和面向对象2、类的引入3、类的定义4、类的访问限定符及封装4.1、访问限定符4.2、封装 5、类的作用域6、类的实例化(对象)7、类对象模型7.1、类对象的存储方式7.2、结构体ÿ…...
【开源】基于Vue.js的生活废品回收系统的设计和实现
目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案,旨…...
Mysql配置主从复制-GTID模式
目录 主从复制 主从复制的定义 主从复制的原理 主从复制的优势 主从复制的形式 主从复制的模式 主从复制的类型 GTID模式 GTID的概念 GTID的优势 GTID的原理 GTID的配置 Mysql主服务器 编辑 Mysql从服务器 编辑 主从复制 主从复制的定义 是指把数据从一个…...
Flink之状态管理
Flink状态管理 状态概述状态分类 键控、按键分区状态概述值状态 ValueState列表状态 ListStateMap状态 MapState归约状态 ReducingState聚合状态 Aggregating State 算子状态概述列表状态 ListState联合列表状态 UnionListState广播状态 Broadcast State 状态有效期 (TTL)概述S…...
[Mac软件]Adobe Media Encoder 2024 V24.0.2免激活版
软件说明 使用Media Encoder,您将能够处理和管理多媒体。插入、转码、创建代理版本,并几乎以任何可用的格式输出。在应用程序中以单一方式使用多媒体,包括Premiere Pro、After Effects和Audition。 紧密整合 与Adobe Premiere Pro、After …...
Bytebase 2.11.0 - 支持 OceanBase Oracle 模式
🚀 新功能 支持 OceanBase Oracle 模式。支持设置 MySQL 在线变更参数。新增项目数据库查看者的角色。 🎄 改进 支持在项目中直接选择所有用户并为之添加角色。 调整了项目页面的布局。在 SQL 编辑器中通过悬浮面板展示表和列的详情。 🪦 …...
『CV学习笔记』文本识别算法CRNNSVTR介绍
文本识别算法CRNN&SVTR介绍 文章目录 一. 文本识别1.1. 文本识别方法介绍1.1.1. 规则文本识别1.1.2. 不规则文本识别1.2. CRNN算法原理1.2.1. CRNN基本网络结构1.3. SVTR算法原理二. 参考文献一. 文本识别 文本识别是OCR(Optical Character Recognition)的一个子任务,其…...
HaaS510开板式DTU真机连云:上报监测数据至阿里云物联网平台
背景 HaaS: Hardware as a Service。 HAAS510 是一种开板式 DTU ,旨在为用户已开发好的设备快速增加 4G 连云能力的 4G CAT1 数传模块。它通过将模组与用户设备集成到一个外壳内,既保持设备的一体性,又降低重新开发 PCB 的时间消耗和模组开…...
贾扬清开源 AI 框架 Caffe | 开源英雄
【编者按】在开源与人工智能的灿烂星河里,贾扬清的名字都格外地耀眼。因为导师 Trevor Darrell 教授的一句“你是想多花时间写一篇大家估计不是很在意的毕业论文,还是写一个将来大家都会用的框架?”,学生贾扬清一头扎进了创 Caffe…...
【objectarx.net】使用公式自动更新表格项的内容
使用公式自动更新表格项的内容...
CSS 移动端 1px(线条/边框) 不同机型上显示粗细不同,解决办法
由于不同的手机有不同的像素密度导致的。如果移动显示屏的分辨率始终是普通屏幕的2倍,1px的边框在devicePixelRatio2的移动显示屏下会显示成2px,所以在高清瓶下看着1px总是感觉变胖了 <!DOCTYPE html> <html lang"en"> <head&g…...
vue3使用vuex的示例(模块化功能)
目录 1. store/index.ts 2. main.ts 3. App.vue调用 4. 如果删除moduleA的namespaced属性, 保留moduleB的namespaced:true 5. 则App.vue修改为: 1. store/index.ts 注意: 需要使用时带上模块名称的namespaced必须为true, 不写或者为false时调用时不需要写模块名称(获取st…...
Vatee万腾的科技决策力奇迹:Vatee科技决策力的独特之选
在金融投资的复杂领域中,Vatee万腾以其独特的科技决策力创造了一场真正的奇迹。这不仅是一种引领投资者走向成功的选择,更是一种开启新时代的科技决策奇迹。 Vatee的科技决策力背后蕴藏着强大的智慧和创新。通过大数据分析、智能算法的运用,V…...
ai技术是怎么换脸的,实现原理是什么,有那些软件
人工智能(AI)在近年来的迅猛发展中,带来了许多令人惊叹的技术创新,其中之一就是人工智能换脸技术。这项技术通过深度学习和图像处理的手段,使得用户可以将自己的面孔替换成其他人物,引发了广泛的讨论和应用…...
在IDEA中使用maven项目总结
一 什么是maven Maven本身也是Java写的,他是一款服务于Java平台的自动化构建工具 Maven是一个项目管理工具,旨在简化软件项目的构建、依赖管理和项目信息管理。它使用基于项目对象模型(Project Object Model,POM)的…...
oracle备份一个表需要做的操作
在 Oracle 中备份一个表可以通过以下步骤完成,包括备份表结构(DDL)和备份表数据(DML): 备份表结构(DDL): 使用 CREATE TABLE AS SELECT: 创建一个新表&#…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
