归并排序——

news2024/11/28 0:31:33

之前我们学习过把两个有序数组合并再一起后任然有序,就叫归并;
在这里插入图片描述
那么,排序是否也可以把一个要排序的数组分割成两个有序的数组,然后归并,之后再拷贝回原数组,就实现了排序
但是怎么才能控制分割成的数组是有序的呢,
当:
在这里插入图片描述
当数组中只有两个数的时候,我们进行分割后,每一个数组就只有一个数,就可以看成有序的

有了这个思想,那么我们就递归分个要排序的数组,当递归分割到只有两个数的时候,在归并
在这里插入图片描述

void Merge(int* a, int* tmp, int begin, int end)
{
	//分割
	if (begin == end)
	{
		return;
	}
	int mid = (begin + end) / 2;
	Merge(a, tmp, begin, mid);
	Merge(a, tmp, mid + 1, end);
	//归并
	int begin1 = begin;
	int end1 = mid;
	int begin2 = mid + 1;
	int end2 = end;
	int dex = begin;
	while (begin1<=end1&&begin2<=end2)
	{
		if (a[begin1] <= a[begin2])
		{
			tmp[dex] = a[begin1];
			dex++;
			begin1++;
		}
		else
		{
			tmp[dex] = a[begin2];
			dex++;
			begin2++;
		}
	}
	while (begin1 <= end1)
	{
		tmp[dex] = a[begin1];
		dex++;
		begin1++;
	}
	while (begin2 <= end2)
	{
		tmp[dex] = a[begin2];
		dex++;
		begin2++;
	}
	//拷贝回去
	memcpy(a + begin, tmp + begin, (end - begin + 1) * sizeof(int));
	

}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	Merge(a,tmp,0,n-1);
}

非递归的写法:
之前的快速排序是借助栈来实现非递归,因为每次分完之后他就找出了key的位置,那个区间出栈后不需要再用到
但是归并排序的话,分割完后,还要用到之前的分割区间,但是都已经出栈了,就找不到了。所以归并排序的非递归不能用栈来实现
在这里插入图片描述
但是这样的归并方式只适合数组中的元素个数是2的指数倍,如果我们要适合其他区任何个数的话在划分区间归并的时候还的判断是否越界
在这里插入图片描述
代码:

void MergeSortNoNs(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);

	int pas = 1;
	while (pas<n)
	{
		for (int i = 0; i < n; i += pas * 2)
		{
			int begin1 = i; int end1 = i + pas - 1;
			int begin2 = i + pas; int end2 = i + 2 * pas - 1;
			//越界管理
			if (begin2 >= n)
			{
				break;
			}
			if (end2 >= n)
			{
				end2 = n - 1;
			}
			int dex = i;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] <= a[begin2])
				{
					tmp[dex] = a[begin1];
					dex++;
					begin1++;
				}
				else
				{
					tmp[dex] = a[begin2];
					dex++;
					begin2++;
				}
			}
			while (begin1 <= end1)
			{
				tmp[dex] = a[begin1];
				dex++;
				begin1++;
			}
			while (begin2 <= end2)
			{
				tmp[dex] = a[begin2];
				dex++;
				begin2++;
			}
			//拷贝回去
			memcpy(a + i, tmp+i, (end2-i+1) * sizeof(int));

		}
		pas *= 2;
	}
}

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

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

相关文章

MediaPlayer

1、概念 MediaPlayer是Android原生的多媒体播放器&#xff0c;可以用它来实现本地或者在线音视频的播放。 2、MediaPlayer的状态 下面的图是官方给出的状态转换图&#xff0c;也可易理解为MediaPlayer的生命周期。 椭圆形&#xff1a;表示MediaPlayer的状态&#xff1b;弧形…

视频下载软件 Downie4 mac中文介绍

Downie mac是一款Mac平台上非常实用的视频下载工具。它支持下载各种视频网站上的视频&#xff0c;并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频&#xff0c;包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff…

【PWN · heap | Off-By-One】Asis CTF 2016 b00ks

萌新进度太慢了&#xff0c;才真正开始heap&#xff0c;还是从简单的Off-By-One开始吧 前言 步入堆的学习。堆的知识复杂而多&#xff0c;于是想着由wiki从简单部分逐个啃。 b00ks是经典的堆上off-by-one漏洞题目。刚开始看很懵&#xff08;因为确实连堆的管理机制都没有完全…

为什么多线程会带来性能问题?

为什么多线程会带来性能问题&#xff1f; 什么是性能问题 在上一篇中&#xff0c;我们已经学习了多线程带来的线程安全问题&#xff0c;但对于多线程而言&#xff0c;它不仅可能会带来线程安全问题&#xff0c;还有可能会带来性能问题&#xff0c;也许你会奇怪&#xff0c;我…

C生万物 | 从浅入深理解指针【第二部分】

C生万物 | 从浅入深理解指针【第二部分】 前言&#xff1a; 如果没有看过第一部分的话&#xff0c;推荐先看第一部分&#xff0c;然后再来看第二部分~~ 文章目录 C生万物 | 从浅入深理解指针【第二部分】前言&#xff1a;1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的…

很多年前负责的BPO业务

业务最多的时候大约有120人左右&#xff0c;后来这个部门就去掉了。只留了4个领导。原因是俺开发了一些系统&#xff0c;替代了这个部门的人工。 当时的一些文档 &#xff0c;现在还保留着。 数据安全最重要&#xff1a;严格控制网络安全漏洞&#xff0c;防止业务数据泄密。为…

4.3 视图机制

4.3 视图机制的笔记整理&#xff1a; 视图的作用&#xff1a; 数据隔离&#xff1a;为不同的用户提供不同的数据视图&#xff0c;从而限制数据对象的可见范围。安全保护&#xff1a;通过视图隐藏敏感或保密的数据&#xff0c;使无权存取的用户无法直接看到这些数据&#xff0c;…

ruoyi vue前后端分离功能介绍

文章目录 内置功能:用户管理&#xff1a;部门管理&#xff1a;岗位管理&#xff1a;菜单管理&#xff1a;角色管理&#xff1a;字典管理&#xff1a;参数管理&#xff1a; 可以设置是否开启验证码功能通知公告&#xff1a;操作日志&#xff1a;登录日志&#xff1a;在线用户&am…

redis学习03

Redis持久化 RDB&#xff08;Redis DataBase&#xff09; RDB&#xff08;Redis 数据库&#xff09;&#xff1a;RDB 持久性以指定的时间间隔执行数据集的时间点快照。   实现类似照片记录效果的方式&#xff0c;就是把某一时刻的数据和状态以文件的形式写到磁盘上&#xff…

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测

时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现ARIMA-LSTM差分自回归移动差分自回归移动平均模型模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果…

【趣味随笔】盘点仿生机器人都有哪些

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

Java JVM垃圾回收确定垃圾的两种方式,GC Root

文章目录 前言一、如何确定是垃圾&#xff1f;引用计数法根可达路径法 二、GC Root1、以下可作为GC Root对象2、判断可回收&#xff1a;GC Root不可达3、真正宣告对象死亡需经过两次标记过程&#xff08;重要&#xff09; 前言 对于Java两种确定对象为可回收的两种方式&#x…

Cocos Creator 中使用装饰器进行自动绑定

推荐一个偷懒的方式&#xff0c;使用装饰器自动绑定节点到脚本的属性 背景 用 Cocos Creator 写脚本组件的时候&#xff0c;有时需要场景中一个节点作为这个脚本的属性值。 按照官方文档推荐的方法&#xff0c;需要以下两步 添加一个 property 属性&#xff0c;在场景中拖入这个…

基于人工蜂群算法的无人机航迹规划-附代码

基于人工蜂群算法的无人机航迹规划 文章目录 基于人工蜂群算法的无人机航迹规划1.人工蜂群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用人工蜂群算法来优化无人机航迹规划。 …

计算机网络重点概念整理-第三章 数据链路层【期末复习|考研复习】

第三章 数据链路层 【期末复习|考研复习】 计算机网络系列文章传送门&#xff1a; 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 第三章 数据链路层 【期末复习…

未来世界:16项改变人类社会的新技术

2016年出版的图书《未来世界&#xff1a;改变人类社会的新技术》&#xff0c;作者是美国的史蒂芬科特勒&#xff08;Steven Kotler&#xff09;&#xff0c;里面是对各种前沿科技的展望&#xff0c;比如仿生人、机器人、飞行汽车、人工生命、生命延长、行星矿业、意识下载等。 …

前端 :用HTML , CSS ,JS 做一个秒表

1.HTML&#xff1a; <body><div id "content"><div id "top"><div id"time">00:00:000</div></div><div id "bottom"><div id "btn_start">开始</div><div …

剪辑中遮罩可分几种 剪辑遮罩视频怎么做

当你觉得剪辑特效很难制作的时候&#xff0c;不妨阅读一下本文&#xff0c;来了解遮罩的原理和用法。它是一种超级剪辑工具&#xff0c;可以制作出各种神奇的画面效果。在了解遮罩的基本原理后&#xff0c;就连初学者也能轻松地制作出令人惊艳的剪辑遮罩。有关剪辑中遮罩可分几…

搞懂 MySql 的架构和执行流程

搞懂 MySql 的架构和执行流程 1、MySQL 的三层架构2、SQL 的执行流程2.1、连接器2.2、解析器2.3、预处理器2.4、优化器2.5、执行器2.6、存储引擎 3、关于Select 的两个顺序 1、MySQL 的三层架构 MySQL的三层结构包括&#xff1a; 连接层&#xff1a;负责与MySQL客户端之间的通…

ChatGPT从入门到精通

目录 什么是ChatGPT&#xff1f;ChatGPT能帮我干什么&#xff1f;标题在哪里可以使用ChatGPT&#xff1f;什么是ILoveChatGPT&#xff08;IMYAI&#xff09;&#xff1f;标题如何拥有头像&#xff1f;如何获取更多对话次数&#xff1f;!标题如何提问GPT&#xff1f;如何正确地利…