当前位置: 首页 > news >正文

【数据结构】归并排序

​​在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:数据结构
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵
希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、基本思想(递归)
  • 二、归并的方式(双指针算法)
  • 三、递归代码实现
  • 四、非递归版归并排序
      • 4.1 思路
      • 4. 2 代码实现

一、基本思想(递归)

在这里插入图片描述
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。有点类似于二叉树的后序遍历。

归并排序前提是两个序列必须是有序,然后再从两个序列中选数到一个临时数组中。

以下是归并排序的核心步骤:

  1. 确定分界点。目的是为了分为两个序列mid = (left + right) >> 1
  2. 递归处理分界点的左右两部分的区间[left, mid] [mid + 1, right]
  3. 【✨重点✨】归并。如上图所示,当递归至区间只有一个数后,开始将两个有序序列合并成一个有序序列

二、归并的方式(双指针算法)

在这里插入图片描述

  1. 使用两个指针ij, 分别指向分界点两端的数组头。
  2. 创建一个临时数组tmp来暂存排完有序的数组,用k来遍历tmp
  3. 比较a[i]a[j]直到其中一个序列中的元素全部遍历完。这就分为两种情况:若a[i] <= a[j],则tmp[k++] = a[i++](将小的元素放入tmp中);同理,若a[i] > a[j],则tmp[k++] = a[j++]
  4. 可能会存在特殊情况:左、右两个区间可能会有多余元素没有比较完,则将多余元素原封不动放入数组tmp
  5. 最后再将tmp数组中的元素复制回原数组a[]

三、递归代码实现

void RMergeSort(int a[], int l, int r, int* tmp)
{// 当区间只有一个数或者没有数,没必要排序了if (l >= r) return;// 1. 确定分界点下标int mid = (l + r) >> 1;// 2. 递归处理分界点左右两端区间RMergeSort(a, l, mid, tmp);RMergeSort(a, mid + 1, r, tmp);// 当递归结束来到此处,说明分界点左右两边已经是有序的了// 3. 归并int i = l, j = mid + 1;int k = 0;while (i <= mid && j <= r){if (a[i] <= a[j])tmp[k++] = a[i++];elsetmp[k++] = a[j++];}// 可能存在某个区间没有遍历完while (i <= mid)tmp[k++] = a[i++];while (j <= r)tmp[k++] = a[j++];// 将已排好序tmp还给原数组afor (int i = l, k = 0; i <= r; i++, k++)a[i] = tmp[k];
}// 归并排序(递归)
void MergeSort(int a[], int n)
{int* tmp = new int[n];// 如果在此函数递归,每次都要new大小为n的对象,消耗太大RMergeSort(a, 0, n - 1, tmp);delete[] tmp;
}

四、非递归版归并排序

4.1 思路

归并排序的非递归实现通常使用迭代和循环来模拟递归过程。下面是归并排序非递归实现的基本思路:

  1. 分组: 首先,将原始数组视为若干个长度为1的有序子数组(因为长度为1的数组是有序的)。

  2. 两两合并: 然后进行迭代,将相邻的两个有序子数组进行合并,并按照合并后的顺序形成新的有序子数组。这一步可以通过循环实现。

  3. 增加子数组长度: 接着,将子数组长度翻倍,重复上述合并操作,直到整个数组成为一个有序的数组。

在这里插入图片描述

值得注意的是,归并排序的非递归实现需要考虑如何处理边界情况、子数组长度变化等细节,但整体思路和递归实现是类似的。

4. 2 代码实现

void mergeSort(int a[], int l, int r, int n)
{// 辅助数组int* tmp = (int*)malloc(sizeof(int) * n);int gap = 1;while (gap < n){for (int i = 0; i <= r; i = i + 2 * gap){int begin1 = i, end1 = i + gap - 1, mid = i + gap - 1;int begin2 = mid + 1, end2 = i + 2 * gap - 1;int j = i;if (begin2 > r) break;if (end2 > r) end2 = r;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]) tmp[j++] = a[begin1++];else tmp[j++] = a[begin2++];}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}for (int j = i; j <= end2; j++){a[j] = tmp[j];}}gap = 2 * gap;}
}

相关文章:

【数据结构】归并排序

​​ &#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你…...

数字引领,智慧赋能|袋鼠云与易知微共同亮相2023智慧港口大会

2023年10月19日&#xff0c;由中国港口协会、中国交通通信信息中心、天津港&#xff08;集团&#xff09;有限公司主办&#xff0c;中国港口协会智慧港口专业委员会、《港口科技》杂志社等单位承办的以“数字引领 智慧赋能”为主题的“2023智慧港口大会”在天津顺利召开。 袋鼠…...

星火模型(Spark)的langchain 实现

星火模型的langchain实现 测试已通过&#xff0c;希望有所帮助。 使用前请先安装环境&#xff1a; pip install githttps://github.com/shell-nlp/spark-ai-python.git注意&#xff1a; 一定要使用上面方式安装spark库&#xff0c;因对官方的库做了改动。官方的库已经长时间不…...

python运算符重载之构造函数和迭代器

1 python运算符重载之构造函数和迭代器 python运算符重载是在类方法中拦截内置操作-当类的实例使用内置操作时&#xff0c;pytho自动调用对应方法&#xff0c;并且返回操作结果。 NO#描述1拦截运算运算符重载拦截内置操作&#xff0c;比如打印、函数调用、点号运算、表达式运…...

【数据处理】Python:实现求条件分布函数 | 求平均值方差和协方差 | 求函数函数期望值的函数 | 概率论

猛戳订阅! 👉 《一起玩蛇》🐍 💭 写在前面:本章我们将通过 Python 手动实现条件分布函数的计算,实现求平均值,方差和协方差函数,实现求函数期望值的函数。部署的测试代码放到文后了,运行所需环境 python version >= 3.6,numpy >= 1.15,nltk >= 3.4,tqd…...

new/delete 和malloc/free的区别

C中&#xff1a; 创建单个数据空间&#xff1a; char *ch new char; delete ch; ch NULL; 创建多个数据空间&#xff1a; char *ch new char[4]; delete [] ch; ch NULL; C语言中&#xff1a; 创建单个数据空间&#xff1a; char *ch malloc(sizeof(char)); fre…...

Linux程序设计(上)

系列文章目录 文章目录 系列文章目录前言一、unix, linux, GNU, POSIXLinux程序 二、shellshell语法1.变量2.语句 函数命令命令的执行dialog工具-- 三、文件操作1. Linux 文件结构2. 系统调用和设备驱动程序3. 库函数4. 底层文件访问5. 标准I/O库6.格式化输入输出7. 文件和目录…...

mysql面试题——存储引擎相关

一&#xff1a;MySQL 支持哪些存储引擎? MySQL支持多种存储引擎&#xff0c;比如InnoDB&#xff0c;MyISAM&#xff0c; MySQL大于等于5.5之后&#xff0c;默认存储引擎是InnoDB 二&#xff1a;InnoDB 和 MyISAM 有什么区别? InnoDB支持事务&#xff0c;MyISAM不支持InnoD…...

趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的方法和步骤。你要挑战的蓝桥杯&#xff0c;实际也是在设计算法解决问题。其实各种编程语言都只是工具&#xff0c;而程序的核心数据结构算法。犹如练武&#xff0c;数据结构和算…...

使用Pandas进行时间重采样,充分挖掘数据价值

大家好&#xff0c;时间序列数据蕴含着很大价值&#xff0c;通过重采样技术可以提升原始数据的表现形式。本文将介绍数据重采样方法和工具&#xff0c;提升数据可视化技巧。 在进行时间数据可视化时&#xff0c;数据重采样是至关重要且非常有用的&#xff0c;它支持控制数据的…...

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)

文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前&#xff0c;我们在D…...

德语B级SampleAcademy

德语B级 一, 反身代词&#xff08;1&#xff09;A 主语和宾语一致&#xff08;2&#xff09;D 双宾语&#xff0c;主语与直接宾语不一致(3), 补充单词&#xff08;4&#xff09;真反身代词(5)假反身代词(6)真假反身代词(7)相互反身(8)非反身#反身#相互反身 二&#xff0c;Nomen…...

vue3自定义hooks

获取dom的id属性 index.ts import { onMounted } from "vue" type option {el: string }export default function(option:option):Promise<{name: string}> {return new Promise((resolve)>{onMounted(()>{const dom:HTMLElement document.querySele…...

Consistency Models 阅读笔记

简介 Diffusion models需要多步迭代采样才能生成一张图片&#xff0c;这导致生成速度很慢。一致性模型&#xff08;Consistency models&#xff09;的提出是为了加速生成过程。 Consistency models可以直接一步采样就生成图片&#xff0c;但是也允许进行多步采样来提高生成的质…...

杭电oj 2034 人见人爱A-B C语言

此处的c和a指向同一块内存空间&#xff0c;改变c就是改变a&#xff0c;反之亦然&#xff0c;此处是为了方便看这么写的&#xff0c;如果不想c和a指向同一空间请分别开辟空间&#xff08;即不如此写camalloc&#xff09; #include<stdio.h> #include<stdlib.h>int …...

springboot(ssm大学生成绩管理系统 成绩管理平台Java(codeLW)

springboot(ssm大学生成绩管理系统 成绩管理平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&…...

SOME/IP 协议介绍(五)指南

指南&#xff08;信息性&#xff09; 选择传输协议 SOME/IP直接支持互联网上使用最广泛的两种传输协议&#xff1a;用户数据报协议&#xff08;UDP&#xff09;和传输控制协议&#xff08;TCP&#xff09;。UDP是一种非常简洁的传输协议&#xff0c;仅支持最重要的功能&#…...

Python调用企微机器人: 发送常用格式汇总

企微接口文档 发送应用消息 - 接口文档 - 企业微信开发者中心 发送格式 应用支持推送文本、图片、视频、文件、图文等类型。 ~~~以下列举常用格式 示例~~~ 1.发送文本 代码如下&#xff1a; def sendtxt_robotmsg(self):# 正式keywx_key "xx"wx_webhookurl htt…...

论文阅读——DiffusionDet

在目标检测上使用扩散模型 前向过程&#xff1a;真实框-->随机框 后向过程&#xff1a;随机框-->真实框 前向过程&#xff1a; 一般一张图片真实框的数目不同&#xff0c;填补到同一的N个框&#xff0c;填补方法可以是重复真实框&#xff0c;填补和图片大小一样的框&a…...

elmenetui表格二次封装包含查询框和分页

<!--dataList: 表格数据columnList: 表头字段 宽度minWidth使用slotName字段: 需要对列数据进行处理&#xff0c;不写prop字段&#xff0c;使用slotName字段btnText<String>: 按钮字段btnIcon<String>: 按钮的iconbtnEvent: 按钮事件btnType: 按钮类型getHeigh…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...