【数据结构】归并排序

1、介绍

归并排序(merge sort)是一种基于分治策略的排序算法,包含“划分”和“合并”阶段。

  1. 划分阶段:通过递归不断地将数组从中点处分开,将长数组的排序问题转换为短数组的排序问题。

  2. 合并阶段:当子数组长度为 1 时终止划分,开始合并,持续地将左右两个较短的有序数组合并为一个较长的有序数组,直至结束。

2、算法流程

“划分阶段”从顶至底递归地将数组从中点切分为两个子数组。

  1. 计算数组中点 mid ,递归划分左子数组(区间 [left, mid] )和右子数组(区间 [mid + 1, right] )。

  2. 递归执行步骤 1. ,直至子数组区间长度为 1 时终止。

“合并阶段”从底至顶地将左子数组和右子数组合并为一个有序数组。需要注意的是,从长度为 1 的子数组开始合并,合并阶段中的每个子数组都是有序的。

归并排序与二叉树后序遍历的递归顺序是一致的。

  • 后序遍历:先递归左子树,再递归右子树,最后处理根节点。

  • 归并排序:先递归左子数组,再递归右子数组,最后处理合并。

归并排序的实现如以下代码所示。请注意,nums 的待合并区间为 [left, right] ,而 tmp 的对应区间为 [0, right - left]

/*合并左子数组和右子数组 */
void merge(vector<int>& nums,int left, int mid, int right)
{// 左子数组区间为[left,mid],右子数组区间为[mid+1,right]// //创建一个临时数组tmp,用于存放合并后的结果vector<int> tmp(right - left + 1);//初始化左右子数组的起始索引int i = left, j = mid + 1, k = 0;//当左右子数组都还有元素时,进行比较并将较小的元素复制到临时数组中while (i <= mid && j <= right){if (nums[i] <= nums[j]){tmp[k++] = nums[i++];}else{tmp[k++] = nums[j++];}}//将左子数组和右子数组的剩余元素复制到临时数组中while (i <= mid){tmp[k++] = nums[i++];}while (j <= right){tmp[k++] = nums[j++];}//将临时数组tmp中的元素复制回原数组nums的对应区间for(k = 0;k < tmp.size();k++){nums[left + k] = tmp[k];}
}void mergeSort(vector<int>& nums, int left, int right)
{//终止条件if (left >= right){return;}//划分阶段int mid = left + (right - left) / 2;   //计算划分中点mergeSort(nums, left, mid);//递归左子数组mergeSort(nums, mid + 1, right);//递归右子数组//合并阶段merge(nums,left, mid, right);
}

3、算法特性

  • 时间复杂度为 O(nlog⁡n)、非自适应排序:划分产生高度为 log⁡n 的递归树,每层合并的总操作数量为 n ,因此总体时间复杂度为 O(nlog⁡n) 。

  • 空间复杂度为 O(n)、非原地排序:递归深度为 log⁡n ,使用 O(log⁡n) 大小的栈帧空间。合并操作需要借助辅助数组实现,使用 O(n) 大小的额外空间。

  • 稳定排序:在合并过程中,相等元素的次序保持不变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/407103.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的闲一品交易平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 Java技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员…

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储

【探索数据结构与算法】向上调整建堆与向下调整建堆的时间复杂度

一.前言 堆排序是一种优于冒泡排序的算法, 那么在进行堆排序之前, 我们需要先创建堆, 那么这个建堆的时间复杂度是多少呢? 二.下调整算法建堆 因为堆是完全二叉树&#xff0c;而满二叉树也是完全二叉树&#xff0c;此处为了简化使用满二叉树来证明(时间复杂度本来看的就是近…

android13 隐藏状态栏里面的背光调节 隐藏下拉栏背光调节

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 隐藏下拉栏里面的背光调节,禁止用户在这里调节背光亮度。 2.问题分析 我们找到对应的布局,然后在里面隐藏掉。 使用之前文章介绍的布局查找工具,查找亮度条id id/bri…

Adobe Animate (AN)软件安装,硬件配置(附安装包)

目录 一、Adobe An 软件简介 Adobe An 软件的特点 Adobe An 软件的优势 下载 二、Adobe An 软件安装 安装前的准备工作 安装过程中的注意事项 安装后的设置 三、Adobe An 软件使用 高级动画技巧 交互设计 优化与性能提升 四、Adobe An 软件快捷键 选择工具快捷键…

闲置物品交易平台网站商城-计算机毕设Java|springboot实战项目

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

线索精细化管理实践:线上推广渠道线索管理的8个要点

在如今线索获取成本越来越高的情况下&#xff0c;如何获取增量线索、经营好存量线索、实现精细化、高效率线索管理对于企业来说至关重要。获取线索是一切行动的开始&#xff0c;与其建立起稳定、持续的信任关系&#xff0c;达成合作甚至引导复购&#xff0c;是整个线索管理链路…

在网站文章中,‌<br>标签对SEO的影响及优化策略

在网页设计和内容创作中&#xff0c;‌<br>标签常被用于实现文本的换行显示。‌然而&#xff0c;‌对于关注SEO&#xff08;‌搜索引擎优化&#xff09;‌的网站管理员和内容创作者来说&#xff0c;‌<br>标签的使用却需要更加谨慎。‌这是因为<br>标签对SEO…

入门redis

一、安装redis-py库 打开pycharm 在终端中输入 pip install redis 二、连接到redis服务器 import redis r redis.Redis(hostlocalhost, port6379, db0, decode_responsesTrue)host是 Redis 服务器的主机名或 IP 地址&#xff0c;port是端口号&#xff0c;db是要使用的数据库编…

【Word多级标题完整设置】设置各级标题样式将多级列表链接到各级标题样式中

Word多级标题完整设置 一、设置各级标题样式主标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 一级标题样式设置中英文字体、字形以及字号设置段落设置&#xff08;缩进、间距和行距&#xff09; 二级标题样式设置中英文字体、字形…

看图学sql之sql 中的UNION 和union all

UNION 用于合并两个或者多个 SELECT 语句的结果集 语法&#xff1a; SELECT column1, column2 ... FROM table1, table2 [WHERE condition1]UNION / UNION ALLSELECT column1, column2 ... FROM table1, table2 [WHERE condition2] 数据分析社区直达 免费数据分析资料下载。…

JVM系列--初始JVM

根据《黑马程序员JVM虚拟机入门到实战全套视频教程》整理 1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步…

【Canvas与艺术】环状合掌纹

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>环形合掌纹</title><style type"text/css">.…

原生js用Export2Excel导出excel单级表头和多级表头数据方式实现

原生js用Export2Excel导出excel单级表头和多级表头数据方式实现 原生js用Export2Excel导出excel单级表头和多级表头数据方式实现HTML文件导入需要的文件HTML文件中实现导出函数HTML总代码实现汇总&#xff08;直接复制代码&#xff0c;注意js引入路径&#xff09; 原生js用Expo…

Linux驱动入门实验班——DHT11、DS18B20模块驱动(附百问网视频链接)

目录 前言 一、DHT11模块 1.通信协议 2.数据格式 3.编程思路 ①入口函数 ②实现read函数 ③编写中断处理函数 ④***编写数据解析函数 ⑤应用程序 二、DS18B20模块 1. 通信时序 ① 初始化时序 ② 写时序 ③ 读时序 2. 常用命令 3. 编程思路 1.启动温度转换 2…

PPT分享:埃森哲-流程制造的智能工厂规划设计

在分享PPT之前&#xff0c;笔者与大家一起熟悉下&#xff0c;流程制造是什么&#xff0c;与离散制造有哪些区别。 往期回顾>> 125页PPT&#xff1a;某行业数据架构蓝图规划方案 170页PPT&#xff1a;制造业采购供应链及财务管控业务流程蓝图规划 60页PPT:集团SRM项目业…

xxl_job任务调度简单使用

一、概念 任务调度是为了自动完成特定任务&#xff0c;在约定的特定时刻去执行任务的过程 如以下应用场景&#xff1a; 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系统…

【图文并茂】ant design pro 如何对接后端个人信息接口

上一节我们有讲到如何对接登录接口的 【图文并茂】ant design pro 如何对接登录接口 仅仅能登录是最基本的&#xff0c;但是我们要进入后台还是需要另一个接口。 这个接口有两个作用&#xff1a; 来获取当前登录账号的信息&#xff0c;比如头像&#xff0c;用户名&#xff0…

大脑可视化:多种方式实现fMRI的ROI的绘图

前言 在探索神经科学的深邃领域中&#xff0c;我们常常面临着如何将复杂的脑区数据以一种清晰、直观的方式呈现给同行和公众的挑战。随着功能性磁共振成像&#xff08;fMRI&#xff09;技术的发展&#xff0c;我们拥有了更多工具来揭示大脑的奥秘。本文旨在介绍一系列笔者学习的…

深度学习从入门到精通——大模型认知理解

大模型认知 1. 传统区别与实际运用 1.1 小模型时代工作方式 小模型&#xff08;如视觉模型、语义模型、语音模型、决策/规划模型&#xff09;和大模型&#xff08;如GPT、BERT等大型预训练模型&#xff09;的工作方式和特点存在一些关键区别。 视觉模型 工作方式: 视觉模型…