非递归的归并排序

news2024/9/21 12:33:38

我们之前讲的快速排序有非递归的写法,那么归并排序也有非递归写法,我们一起来研究一下吧。

快速排序的非递归算法是使用的手动搭栈的方法,将区间存入栈里面,然后再排序,但是这次的归并排序可以吗?大家都知道归并排序是让左区间有序,右区间有序,然后再回到原来的区间使其有序,这个思路就类似于我们之前了解的后序一样,而快速排序就类似于中序,所以说,这次的归并排序就不能用搭栈的方法来实现非递归,那么,我们怎么实现呢?

思路,我们让这个数组先每个数一组,然后,使每一组都有序,然后,使每两组都有序,以此类推,我们就可以让整个数组有序。废话少说,大家看图:

相信我画的这幅图应该很清楚的表述了我的思路。

细节处理 

以上是大的思路,但是我们也有很多小细节也要处理好,否则千里之堤溃于蚁穴,前功尽弃。

区间处理

如上图所示,我们每次都会先分成两组,然后让他们有序,最好的方法就是设置两个区间,然后,再用变量控制这个区间,这是效率最高,又通俗易懂的方法,那么两个区间就是 

【begin1   end1】,【begin2   end2】;

设置一个i变量控制我们最左区间,设置一个gap等于我们每一组的数据个数,具体对应的样子上面的图也展示的很清楚,begin1就是i,然后其余的数就是根据这个gap来确定的,具体是什么样子请看下图:

这样安排数组就可以达到滚车轮的效果。

单数数组的越界 

我们先看一张图

这就很准确的表达了我们遇到的问题,万一给的数组不能双双配对怎么办?我们继续看后面 

上图是区间的变化图,显示的第一个越界是end2越界,第二个就是begin2和end2越界,所以说我们需要有针对这两种情况的处理办法,第一种,begin2和end2都越界,我们就抛弃他们,然后进入 下一个循环,第二种,end2越界,那么就让end2等于n-1。

代码展示

//非递归的归并排序
void MergeSortNonR(int* a, int* tmp,int n)
{
	int gap = 1;
	while (gap < n)
	{
		for (int i = 0; i < n;i += gap * 2)
		{
			int begin1 = i;
			int end1 = i + gap - 1;
			int begin2 = i + gap;
			int end2 = i + gap * 2 - 1;
			if (begin2 >= n)
			{
				break;
			}
			if (end2 >= n)
			{
				end2 = n - 1;
			}
			int j = i;

			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] < a[begin2])
				{
					tmp[j++] = a[begin1++];
				}
				else
				{
					tmp[j++] = a[begin2++];
				}
			}
			//第一个数组没有全部进tmp数组
			while (begin1 <= end1)
			{
				tmp[j++] = a[begin1++];
			}
			//第二个没进
			while (begin2 <= end2)
			{
				tmp[j++] = a[begin2++];
			}
			memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));

		}
		gap = gap * 2;

	}

}

大家可以试着自己调试一下。 

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

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

相关文章

WebLogic 8.x中间件监控指标解读

监控易是一款功能强大的IT监控系统&#xff0c;能够全面监控各类IT设施的运行状态&#xff0c;及时发现并解决潜在问题。针对WebLogic 8.x中间件的监控&#xff0c;监控易提供了一系列详尽的指标&#xff0c;确保WebLogic集群和应用的稳定运行。 在WebLogic集群监控方面&#x…

OSPF路由协议----开放式最短路径优先

一、为什么需要OSPF? 1、RIP以跳数评估的路由并非最优路径 传输时间T=2Mps/64Kbps=32s 如果选择S0/0传输,传输时间T=2Mps/2Mps+2Mps/2Mps+2Mps/2Mps=3s 时长大大缩短。 2、RIP的最大跳数为16,网络尺度小 RIP协议限制网络直径不能朝超过16跳,只适用于小型网。 3、RIP收…

登录谷歌账号时无法登录,提示“您正常是在一部Google无法识别的设备上登录”,原因和如何解决?

这段时间&#xff0c;有几个朋友联系GG账号服务&#xff0c;说她们在登录谷歌账号的时候&#xff0c;提示Google账号无法登录&#xff0c;提示&#xff1a;您正尝试在一部Google无法识别的设备上登录&#xff0c;我们没有足够的信息来验证您的身份。为了安全起见&#xff0c;您…

浦语提示词工程实践

第一次 -失败 修改后&#xff1a;

中缀与前缀表达式之间的转换

文章目录 中缀表达式转前缀表达式总结参考链接 中缀表达式转前缀表达式 前缀表达式&#xff0c;又称波兰表达式&#xff0c;是一种编写算术表达式的方法&#xff0c;其中运算符位于操作数之前。 下面给出一种中缀表达式转前缀表达式的方法&#xff0c;利用辅助栈。 其规责如下…

朱锐 | 生命图像中的时间和意识

本文载于《科学・经济・社会》2023 年第 41 卷第 2 期第 37~61 页 作者简介&#xff1a; 朱锐&#xff08;1968年10月—2024年8月1日&#xff09;&#xff0c;中国人民大学哲学院杰出学者、特聘教授&#xff0c;美国德州州立大学客座教授&#xff0c;主要从事神经哲学、心灵哲…

大学生编程入门指南:如何从零开始?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 编程语言选择 &#x1f4da; 1. Python 2. JavaScript 3. Java 4. C/C 如何选择适合自己的编程语言&a…

人工智能深度学习系列—探索余弦相似度损失:深度学习中的相似性度量神器

文章目录 1. 背景介绍2. Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 在机器学习和模式识别领域&#xff0c;评估样本间的相似性是一项基本而关键的任务。余弦相似度损失&#xff08;Cosine Similarity Loss&#xff09;作为一种衡量向量间相似度的损失函数&#…

TPAMI 2024 | 全新框架!深度学习可解释度量学习!

TPAMI 2024 | 全新框架&#xff01;深度学习可解释度量学习&#xff01; DIML: Deep Interpretable Metric Learning via Structural Matching 题目&#xff1a;DIML: 通过结构匹配的深度可解释度量学习 作者&#xff1a;Wenliang Zhao, Yongming Rao, Jie Zhou , and Jiwen…

DedeCMS-V5.7.82-UTF8织梦管理系统漏洞

将靶场环境放到www目录下——访问/dedecms/uploads 安装程序 - 织梦内容管理系统 V5.7 UTF8SP2 同意协议——继续 继续 配置后——点击继续 进入后台 登录后台——填写用户名密码。 方法一&#xff1a;上传shell文件 后台——核心——附件管理——上传新文件。 访问/dedecms…

用车申请轻松搞定,智慧校园行政办公一站解决

智慧校园行政办公中的用车申请功能是为了解决校园内教师及工作人员出行需求而设计的一套数字化管理系统。作为智慧校园行政办公的一个重要模块&#xff0c;该功能旨在提高校园用车效率&#xff0c;简化申请流程&#xff0c;确保资源合理分配。 在用户提交在线用车申请之前&…

Win7虚拟机分享(已安装VMware Tools)

前言 之前写过VMware安装Win7并安装VMware tools的博客&#xff0c;但操作仍显繁琐。后来发现可以直接分享已经配置好的虚拟机&#xff0c;所有软件都是安装好的&#xff0c;解压即用。 一. VMware Win7虚拟机配置 已完成的配置和安装的软件 专业版Win7系统(已永久激活)VMware…

个人航班追踪和查看软件Jetlog

什么是 Jetlog &#xff1f; Jetlog 是一个自托管航班跟踪器和查看器&#xff0c;允许用户添加、跟踪和分析自己的航班&#xff0c;提供个性化和用户友好的方式来探索航班数据。 软件特点&#xff1a; &#x1f30d; 所有访问过的机场和航班轨迹的世界地图视图&#x1f4ca; 所…

关于技术资产建设

目录 现象 “技术资产”的概念 “技术资产”的意义 效率 质量 成本 “技术资产”的建设 二方库建设 二方库的概念 二方库的开发原则与思路 技术底座建 技术底座建设原则 技术底座的必要性 “技术资产”的演进思路 现象 先说一个经典案例&#xff1a;程序员小a长…

MySQL——数据表的基本操作(二)查看数据表

使用 SQL 语句创建好数据表后,可以通过查看数据表结构的定义,以确认数据表的定义是否正确。在 MySQL中,查看数据表的方式有两种,具体如下。 1、使用 SHOW CREATE TABLE 查看数据表 在 MySQL 中,SHOW CREATE TABLE语句不仅可以查看创建表时的定义语句还可以查看表的字符编码。S…

数据结构与算法 - 双端队列

1. 概述 双端队列、队列、栈对比 定义特点队列一端删除&#xff08;头&#xff09;&#xff0c;另一端添加&#xff08;尾&#xff09;First In First Out栈一端删除和添加&#xff08;顶&#xff09;Last In First Out双端队列两端都可以删除、添加优先级队列优先级高者先出…

Java整合腾讯云发送短信实战Demo

简介 在现代应用开发中&#xff0c;短信服务是非常重要的功能之一。它可以用于用户验证、通知等各种场景。本文将介绍如何使用Java整合腾讯云短信服务&#xff0c;并提供一个完整的实战示例代码。 环境准备 在开始之前&#xff0c;确保你已经完成以下准备工作&#xff1a; 注…

YOLOv10有效涨点专栏目录

试读篇 YOLOv10改进 | Conv篇 | YOLOv10引入AKConv&#xff08;既轻量又提点&#xff09; YOLOv10改进 | 注意力篇 | YOLOv10改进CBAM注意力机制 手把手教你使用YOLOv10训练自己数据集&#xff08;含环境搭建 、数据集查找、模型训练、测试&#xff09; 卷积篇 &#xff08…

蚓链总结数字化营销线上线下融合发展趋势

蚓链数字化营销平台系统工具通过实战、实践总结数字化营销线上线下融合发展趋势如下&#xff1a; 1. 全渠道营销的深化&#xff1a;随着媒体形式的不断丰富和移动互联网技术的发展&#xff0c;全渠道营销能力将越发重要。企业需要在更多的线上和线下渠道进行布局&#xff0c;实…

优化招聘流程:2024年十大HR工具盘点

本文中提到的工具有 &#xff1a;Moka、腾讯企点、泛微E-office、美洽人事、Workday、ADP Workforce Now、SAP SuccessFactors、金蝶云苍穹、BambooHR、钉钉。 在处理日常人力资源任务时&#xff0c;经常感觉到工作效率不够高&#xff0c;招聘、绩效管理或员工福利这些环节总是…