--归并排序--

news2024/11/15 8:38:05

归并排序是我们研究的最后一种排序了,那什么是归并排序呢?

我们之前在力扣上面刷过一个题目,就是合并两个有序数组,其实也是和这个是一个思想借用第三

个数组,然后将第三个数组拷贝给a数组,这样就实现了排序,接下来,我给大家展示一下归并排序的完整过程, 这个动图很好的展现了归并的思想,但是我们首先是让左区间有序,然后让右区间有序,最后再归并,所以我们需要先将a数组分为两组,然后继续划分,将左区间的左右两个区间有序,再继续划分,直到这个数组只有一个数据,就可以返回了,怎么样,这个思想是不是很熟悉,对,就是递归,我们又用到递归了,上面这幅动图虽然很好的展示了归并,但是没有很好的展示划分的过程,显然这时递归的归过程。

细节--区间划分

假如mid是begin+end除以二,那么这个mid有时候并不公平,而如果要划分为两个区间的话,那么就有两种分法:

但是这两种分法有一个是不行的,我们来看一下第一种分法 

第一种分法是不是好像进入了死循环一样,这是因为[2  3]这个区间是 【偶数   偶数+1】那么他们的mid一定是偶数,到时候分出来左区间是乱七八糟的数,而右边是偶数和偶数+1,那么就会一直这样死循环下去,所以我们只能选择第二种分法,那么为什么呢,我们看一下他的流程 

这个红框框里面就是这个分法里面的好处,不会让死循环进行下去。这个细节是很重要的,我们稍不留神就会被带进坑里,并且有点难发现。

代码展示

//归并排序

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

}


void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail!");
		return;
	}
	_MergeSort(a, tmp, 0, n - 1);
}

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

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

相关文章

计算机毕业设计选题推荐-智慧物业服务系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

2024年08月05日截稿 | 第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024)

第三届人工智能、物联网和云计算技术国际会议&#xff08;AIoTC 2024&#xff09; 2024 3rd International Conference on Artificial Intelligence, Internet of Things and Cloud Computing Technology 2024年9月13-15日 | 中国武汉 重要信息 大会官网&#xff1a;www.ic…

S200自检程序报错

现象&#xff1a;在ATE电脑断网的情况下&#xff0c;启动自检程序&#xff0c;提示如下报错&#xff1a; 解决方法&#xff1a;

大模型在RPA领域的应用与探索-代码生成

01. 前言 随着人工智能技术的飞速发展&#xff0c;大模型在多个领域的应用日益广泛。特别是在机器人流程自动化&#xff08;RPA&#xff09;领域&#xff0c;这些技术的进步为自动化任务的执行带来了显著的效率提升。然而&#xff0c;传统RPA在任务流程编排上依赖人工编写脚本…

如何在 VSCode 中使用驭码CodeRider?【实践篇】

极狐GitLab 在 5 月 28 日正式发布了 AI 产品驭码CodeRider&#xff0c;可以使用驭码CodeRider 进行AI 编程 & DevOps 流程处理。现已开启免费试用&#xff0c;登录官网&#xff1a;https://coderider.gitlab.cn/ 即可申请试用。 GitLab 中文版学习资料 驭码CodeRider 官…

大模型之大模型技术生态

本文作为大模型综述第四篇,介绍语言大模型技术生态。 随着大模型技术的快速发展,大模型的生态体系也在快速构建。典型的大模型平台如 ChatGPT、文心一言、讯飞星火等提供如 APP、网页版、 API 接口等多种形式的开放服务,并通过开放插件机制、Function Call 等实现大模型外部…

STL常用容器- set/ multiset 容器

set基本概念 set也叫做集合&#xff0c;它的特点就是所有的元素在插入的时候会自动完成排序(默认是升序排列)。 set在物理空间上也不是连续的&#xff0c;所以它就不支持随机存取&#xff08;利用下标&#xff09;, 它的迭代器也不支持指针算术运算&#xff0c;只能进行和--。…

filebeat

1、作用 1、可以在本机收集日志2、也可以远程收集日志3、轻量级的日志收集系统&#xff0c;可以在非java环境运行。logstash是在jmv环境中运行&#xff0c;资源消耗很大&#xff0c;启动一个logstash要消耗500M左右的内存&#xff0c;filebeat只消耗10M左右的内存。收集nginx的…

在Jira中使用AI

Jira已经可以使用AI功能了。 如果您使用的是Jira Cloud&#xff0c;您需要请管理员在管理页面中打开AI功能开关。&#xff08;AI功能在Standard版中未提供&#xff0c;请使用Premium或更高级的版本&#xff09;如果您使用的是自己部署的Jira Data Center&#xff0c;您需要请管…

Java中实现文件上传

目录 1、文件上传本地 1.1 原理 1.2 如何使用文件上传 1.2.1 引入文件上传的依赖 1.2.2 配置文件上传拦截器 1.2.3 完成文件上传的代码 2、文件上传oss服务器 2.1 为什么需要上传到oss服务器 2.2 如何使用oss 2.2.1 开启oss服务 2.2.2 在Java中引入依赖 2.2.3 查看自…

HarmonyOS(47) onSizeChange和onAreaChange

onSizeChange和onAreaChange onSizeChangeonAreaChangeonAreaChange和onSizeChange的区别参考资料 onSizeChange 组件区域变化时触发该回调。仅会响应由布局变化所导致的组件尺寸发生变化时的回调。由绘制变化所导致的渲染属性变化不会响应回调&#xff0c;如translate、offse…

深度学习模型服务端部署——flask+gunicorn+supervisor+nginx+docker

前言&#xff1a;深度学习模型经过前期的训练调优评估&#xff0c;最终得到一个精度速度满足要求的模型(.pth, .ckpt&#xff0c;或者.onnx等等格式)&#xff0c;但模型要实际用起来&#xff0c;还得部署起来&#xff0c;部署分为在移动端芯片上和服务器上。在移动端芯片部署通…

联邦学习开山之作论文解读与Pytorch实现FedAvg

参考文献&#xff1a;McMahan B, Moore E, Ramage D, et al. Communication-efficient learning of deep networks from decentralized data[C]//Artificial intelligence and statistics. PMLR, 2017: 1273-1282. 参考的文章&#xff1a; 1.联邦学习代码解读&#xff0c;超详细…

Object.defineProperty在Vue2双向绑定中的核心原理及应用

目录 1.Object.defineProperty方法 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;语法 &#xff08;3&#xff09;descriptor属性描述符 2.Object.defineProperty在Vue2双向绑定的核心原理 3.Object.defineProperty在vue2中的应用 &#xff08;1&#xff09…

专业人士如何选?揭秘4款2024年常用的电脑录屏软件!

在这个数字化时代&#xff0c;无论是教学、演示、游戏直播还是软件操作&#xff0c;电脑录屏软件已经是我们日常工作中的好帮手。但市面上这么多的电脑录屏软件&#xff0c;要想挑一款既专业又好用的&#xff0c;还真是挺让人头疼的。今天&#xff0c;我们就来聊聊四款常用的电…

mybatis开启数据库的驼峰命名

在application.yml文件中添加 mybatis:configuration:map-underscore-to-camel-case: true

powerjob连接postgresql数据库(支持docker部署)

1.先去pg建一个powerjob-product库 2.首先去拉最新的包&#xff0c;然后找到server模块&#xff0c;把mysql的配置文件信息替换成pg的 spring.datasource.hikari.auto-committrue spring.datasource.remote.hibernate.properties.hibernate.dialecttech.powerjob.server.pers…

全自动迷你洗衣机什么牌子好?五款卓越内衣洗衣机大合集!

随着科技的发展&#xff0c;市面上也出现许多便利的小家电。其中被多次讨论起来的莫过于是内衣洗衣机&#xff0c;选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;随着内衣洗衣机的爆火&#xff0c;…

maven仓库密码加密方案原理

前言 有一个要求就是说不能使用明文密码&#xff0c;需要对 settings.xml 文件中的password密码进行加密 原始配置是没有对密码进行加密的 <server><id>gleam-repo</id><username>admin</username><password>admin123</password>&l…

7.2 单变量(多->多),attention/informer

继续上文书写&#xff1a; 1 GRU Attention 收敛速度稳定的很多&#xff0c;你看这些模型是不是很容易搭&#xff0c;像积木一样&#xff1b; def create_model(input_shape, output_length,lr1e-3, warehouse"None"):input Input(shapeinput_shape)conv1 Conv…