【数据结构】8.5 归并排序

news2024/11/15 13:44:11

文章目录

  • 相邻两个有序子序列的归并
  • 归并排序算法
  • 归并排序算法分析

基本思想

  • 将两个或两个以上的有序子序列归并为一个有序序列。
  • 在内部排序中,通常采用的是2-路归并排序
    • 即:将两个位置相邻的有序子序列 R[l…m] 和 R[m+1…n] 归并为一个有序序列 R[l…n]。

举个例子

  • 假设初始关键字序列为:{48,34,60,80,75,12,26,48*}。
    • 初始序列有 n 个记录,则可看成是 n 个有序的子序列,每个子序列的长度为 1,然后两两归并,得到 n/2 个长度为 2 或 1 的有序子序列;
    • 再两两归并,……如此重复,直到得到一个长度为 n 的有序序列位置。

在这里插入图片描述

  • 归并排序完成之后的图形很像一棵倒着的树,所以将这种树称为归并树
  • 归并排序需要的趟数就是树的高度,树的高度则是 nlog₂n,也就是说整个归并排序仅需要 nlog₂n 趟。

相邻两个有序子序列的归并

算法步骤

  • 假设两个有序表存放在同一数组中相邻的位置上:R[low…mid] 和 R[mid+1…high],每次分别从两个表中取出一个记录进行关键字的比较,将较小者放入 T[low…high] 中,重复此过程,直到其中一个表为空,最后将另一个非空表余下的部分直接复制到 T 中。

举个例子

  1. 用两个指针分别代表元素的下标,
    • 比较一下当前两个子序列的第一个元素,谁小就将谁放到新的数组当中。
    • 将值存进新数组以后,将指向被拿出元素的数组下标的指针往后移。

在这里插入图片描述
在这里插入图片描述

  1. 再比较两个指针指向的元素,小的存进新数组,然后将指针后移。

在这里插入图片描述

  1. 重复上述步骤,直到其中一个子序列为空为止,最后将另一个非空表中剩下的元素直接搬到新数组中。

在这里插入图片描述

算法描述

//将有序表R[low...mid]和R[mid+1...high]归并为有序表T[low...high]
void Merge(RedType R[],RedType T[],int low,int mid,int high)
{
		int i = low;
		int j = mid + 1;
		int k = low;

		while(i <= mid && j <= high)//将R中记录由小到大并入T中
		{
				if(R[i].key <= R[j].key)
				{
						T[k++] = R[i++];
				}
				else 
				{
					T[K++] = R[j++];
				}
		}
		while(i <= mid)//将剩余的R[i...mid]的元素复制到T中
		{
				T[k++] = R[i++];
		}
		while(j <= high)//将剩余的R[j...high]的元素复制到T中
		{
				T[k++] = R[[j++];
		}		
}

归并排序算法

算法步骤

2-路归并排序将 R[low…high] 中的记录归并排序后放入 T[low…high] 中。当序列长度等于1时,归并结束,否则:

  1. 将当前序列一分为二,求出分裂点 mid = (low +high) / 2;
  2. 对左子序列 R[low…mid] 递归,进行归并排序,将结果放入新数组 S[low…mid] 中;
  3. 对右子序列 R[mid + 1…high] 递归,进行归并排序,结果放入新数组 S[mid + 1…high]中;
  4. 调用函数 Merge,将有序的两个子序列 S[low…mid] 和 S[mid +1…high] 归并为一个有序的序列 T[low…high]。

算法描述

//将R[low...ghig]归并排序后放入T[low...high]中
void MSort(RedType R[],RedType T[],int low,int high)
{
		if(low == high)
		{
				T[low] = R[low];
		}
		else
		{
				mid = (low + high) / 2;//将当前序列一分为二,求出分裂点 mid
				MSort(R,S,low,mid);//对子序列R[low...mid]递归归并排序,将结果放入S[low...mid]中
				MSort(R,s,mid+1,high);//对子序列R[mid...highg]递归归并排序,将结果放入S[mid+1...high]中
				Merge(S,T,low,mid,high);//将S[low...mid]和S[mid+1...high]归并到T[low...high]
		}
}

//对顺序表L做归并排序
void MergeSort(SqList &L)
{
		MSort(L.r,L.r,1,L.length);
}

归并排序算法分析

  • 时间效率O(nlog₂n)
    • 当有 n 个记录时,需要进行 log₂n 趟归并排序,每一趟归并,其关键字比较次数不超过 n,元素移动次数都是 n,因此,归并排序的时间复杂度为 O(nlog₂n)。
  • 空间效率O(n)
    • 因为需要一个与原始序列同样大小的辅助序列(R1)。这正是此算法的缺点。
  • 稳定性稳定

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1个寒假能学会多少网络安全技能?

现在可以看到很多标题都声称三个月内就可以转行网络安全领域&#xff0c;并且成为月入15K的网络工程师。那么&#xff0c;这个寒假的时间能学多少网络安全知识&#xff1f;是否能入门网络安全工程师呢&#xff1f; 答案是肯定的。 虽然网络完全知识是一门广泛的学科&#xff…

在线支付系列【9】微信支付之申请微信公众号

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言申请微信公众号前言 由于微信支付的产品体系全部搭载于微信的社交体系之上&#xff0c;所以直连商户或服务商接入微信支付之前&#xff0c;都需要有一个微信社交载体&#xff0c;该载体对应…

天啦撸~ChatGPT通过国际软件测试工程师(ISTQB)认证了~

天啦撸&#xff01;目前最火的AI应用ChatGPT通过ISTQB认证了~ 近期&#xff0c;国外的一位工程师&#xff0c;放出了他用ChatGPT通过认证的相关信息。 ChatGPT相信大家都知道是什么了&#xff0c;ISTQB相信很多测试小伙伴也不陌生&#xff0c;而且很多考证的小伙伴也对此梦寐以…

Linux之网络性能测试工具netperf实践

一、netperf简介 Netperf是一种网络性能的测量工具&#xff0c;主要针对基于TCP或UDP的传输。Netperf根据应用的不同&#xff0c;可以进行不同模式的网络性能测试&#xff0c;即批量数据传输&#xff08;bulk data transfer&#xff09;模式和请求/应答&#xff08;request/rep…

公司通知要大裁员,hr太强势,和所有人吵起来,老板见势不妙,不得不答应大家要求,把HR一起裁掉了!...

在裁员中&#xff0c;hr一般都会代表老板的利益和员工对抗&#xff0c;但如果hr和员工闹翻了&#xff0c;老板会维护hr吗&#xff1f;一位网友说&#xff1a;一上班就收到消息要裁员&#xff0c;立马让报上名单面谈&#xff0c;锁电脑关权限。后面那些人面谈的时候吵起来了&…

OpenAI Chatgpt注册及使用教程

零、什么是chatgpt?​ 1、简介 ChatGPT&#xff08;Chat Generative Pre-trained Transformer&#xff09;是OpenAI于 2022 年 11 月推出的聊天机器人。它建立在 OpenAI 的GPT-3大型语言模型家族之上&#xff0c;并经过微调&#xff08;一种迁移学习的方法&#xff09;…

双点双向的ISIS与OSPF、OSPF与OSPF、ISIS与ISIS环境以路由策略解决(1tag、2tag、4tag介绍与配置)

3.1.1 双点双向的ISIS与OSPF、OSPF与OSPF、ISIS与ISIS环境以路由策略解决&#xff08;1tag、2tag、4tag介绍与配置&#xff09; OSPF与ISIS双点双向 次优的产生与解决&#xff1a; 由于OSPF引入外部路由之后其优先级为150&#xff0c;再由ASBR进行双向引入之后。 原先OSPF外部…

闲鱼自动化软件——筛选/发送系统 V20已经测试完毕

做程序&#xff0c;就是不断地改&#xff0c;不断地优化。当改动达到一定程序&#xff0c;已经和前面形成断代&#xff0c;程序的升级时刻便到了。V20做了哪些更改或优化。1。优化抓取&#xff1a;在抓取环境优化参数&#xff0c;使抓取更顺滑&#xff0c;抓取数据效果上更准确…

智能家居创意DIY-Homekit智能灯

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…

若依-excel预览功能实现

实现效果及源码 实现效果如下图所示&#xff1a; 实现思路&#xff1a; 1.动态表格&#xff1a;定义表头数组&#xff0c;表格遍历表头生成表格列 2.读取excel文件内容&#xff0c;封装表头&#xff0c;绑定表格数据 代码修改 首先参考若依官网&#xff0c;先实现excel导入功…

C++基础——C++ 字符串

C基础——C 字符串C 字符串C 风格字符串C 中的 String 类C 字符串 C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 ‘…

126、【回溯算法】leetcode ——332. 重新安排行程:回溯算法(C++版本)

题目描述 原题链接&#xff1a;332. 重新安排行程 解题思路 本题要解决的问题&#xff1a; 需要构建起始与目的机场的映射关系&#xff1b;每次选择目的机场时&#xff0c;需要选择当前最小字母顺序的机场&#xff1b;从“JFK”之后依次飞往&#xff0c;并且可能会有多条路径…

58同城AI Lab在WeNet中开源Efficient Conformer模型

2022年8月&#xff0c;58同城TEG-AI Lab语音技术团队完成了WeNet端到端语音识别的大规模落地&#xff0c;替换了此前基于Kaldi的系统&#xff0c;并针对业务需求对识别效果和推理速度展开优化&#xff0c;取得了优异的效果&#xff0c;当前录音文件识别引擎处理语音时长达1000万…

非标设备ERP管理系统可以帮助企业解决哪些管理难题?

多品种、小批量、交货周期短、非标准化生产是大多数非标设备制造企业共同的特性&#xff0c;这就要求非标设备制造企业应具备足够的经营、技术、生产和管理力量&#xff0c;否则就会顾此失彼&#xff0c;产品质量难以得到保证。非标设备制造企业常见的管理难题&#xff08;1&am…

DynaSLAM-2 DynaSLAM中Mask R-CNN部分源码解析(Ⅰ)

目录 1.Mask R-CNN源码地址 2.Mask R-CNN效果 3.项目配置 4.源码使用 1.Mask R-CNN源码地址 Mask R-CNN源码地址https://github.com/matterport/Mask_RCNN/releases 这里我们拿Mask R-CNN2.1版本进行讲解。 2.Mask R-CNN效果 最传统最核心的功能就是物体检测了…

4款让人心疼的电脑软件,由于免费又实用,常被同行挤压

许多小众软件&#xff0c;免费、实用、体验好、无广告&#xff0c;出淤泥而不染&#xff0c;却因过于良心备受排挤&#xff0c;让人唏嘘。 1、oCam 市面上的视频录屏工具&#xff0c;要么限制时长&#xff0c;要么附上水印&#xff0c;需要使用完整功能必须付费&#xff0c;oca…

Java项目调用C++端的订阅功能,获得推送数据(从设计到代码全栈完整过程)

前言 有关java和C的交互的基本概念和知识&#xff0c;本文不再详述。有需要的可以参考我的这篇文章。 JNI、DLL、SO等相关概念 开发背景 C项目端开发了一套股票市场资讯推送的功能&#xff0c;多个小组都会用到该功能&#xff0c;为了避免重复开发&#xff0c;中台小组要负担…

SpringBoot项目集成logback日志分等级配置

背景&#xff1a; 日志的作用&#xff1a; boot项目集成logback&#xff1a; 一、单模块项目配置&#xff1a; 1、添加依赖 2、添加logback-spring.xml配置文件到resources目录下 3、接下来启动一下项目&#xff0c;就可以看到我们的日志已经区分等级打印了 二、多微服务…

DVWA之SQL注入

Low(数字型注入)1、先确定正常和不正常的回显回显&#xff0c;就是显示正在执行的批处理命令及执行的结果等。输入1时&#xff0c;有回显&#xff0c;是正常的 数据库语句&#xff1a; select * from table where id 1输入5时&#xff0c;有回显&#xff0c;是正常的 数据库语句…

Metasploit工具使用(下)

Metasploit工具使用1.Metasploit简介1.1.Metasploit下载1.2.其它参考1.3.本章简述2.Meterpreter2.1.简介2.2.优点2.3.注意事项2.4.整体攻击流程2.4.1.创建后门2.4.2.监听后门2.4.3.运行后门2.4.4.成功获得3.渗透后命令汇总3.1.迁移进程3.1.1.查看当前进程3.1.2.获取当前进程PID…