【非递归版】归并排序算法(2)

news2025/2/26 22:55:10

目录

MergeSortNonR归并排序

非递归&归并排序VS快速排序 

整体思想

图解分析​

代码实现

时间复杂度

归并排序在硬盘上的应用(外排序)


MergeSortNonR归并排序

前面的快速排序的非递归实现,我们借助栈实现。这里我们能否也借助栈去实现归并排序呢?

非递归&归并排序VS快速排序 

  • 快速排序的递归:前序递归
  • 快速排序的非递归:借用栈
  • 快速排序的非递归模拟递归借助栈,实际上来说,快排的非递归模拟回归的过程,就是不入栈。(实际上是没有这个回归过程的)
  • 因为快速排序回归不需要处理,在分割的时候就已经处理了

  • 归并排序的递归:后序递归
  • 归并排序的非递归:直接分解
  • 归并排序回归需要处理,然儿借助栈模拟非递归,根本没有回归这个过程。

  • 处理根  左  右(前序)
  • 左  右 根处理(后序)
  • 借助栈模拟非递归,比较适合前序,后序需要复杂处理是不适合的。

整体思想

  • 借助斐波那契数列的非递归思想
  • 递归的分治是倒着推;非递归的分治是正着推(顺着往前推)
  • 把整个序列直接看成分解之后的(不在去分解了)。直接合并。
  • 一一合并,二二合并,四四合并等等........(❗万一这个不是2的次方数合并呢❓)
  • 每小组合并之后拷贝回原数组(❗不要在每大组合并完再去拷贝❗)
  • 因为是一一合并,二二合并等等。设置一个gap变量控制每大组的合并

每小组

  • 设置begin1&end1&begin2&end2控制两个区间的序列的合并
  • 两段有序序列的合并
  • 拷贝 | 每小组合并之后拷贝回原数组(❗不要在每大组合并完再去拷贝❗)
  • ❗区间必须变化起来

每大组

  • 写入循环for
  • 完成每gap组的合并拷贝
  • 循环使❗区间必须变化起来

整体

  • gap变化起来
  • 结束条件:< n

易错点

  • 每小组合并完之后再去拷贝
  • 区间合并的起始位置&结束位置&拷贝的长度问题
  • 合并的组数不一定都是2的次方倍,越界问题。(可以尝试打印区间来查看越界问题)
  • 越界问题存在三种情况(begin1=i<n不会越界)
  1. end1(后面两个肯定越界,第一序列存在数,第二序列不存在数)
  2. begin2(end2肯定越界,第二序列不存在数)
  3. end2(可能第二序列区间还存在数)

图解分析​​​​​​​​​​​​​​ 

 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
                            //0          n-1
void MergeSortNonR(int* a, int begin, int end, int* tmp)
{

	//直接看成分割完合并的
	int gap = 1;
	//整体
	while (gap < end + 1)
	{
		//每组
		for (int i = 0; i < end + 1; i += 2 * gap)
		{
			//每小组
			int begin1 = i;//不会越界
			int end1 = i + gap - 1;//会越界
			int begin2 = i + gap;
			int end2 = i + 2 * gap - 1;
			int j = i;

			//越界结束=n 
			if (end1 >= end + 1 || begin2 >= end + 1)
			{
				break;
			}
			//越界修改
			if (end2 >= end + 1)//=注意
			{
				end2 = end;
			}

			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++];
			}
			//begin1变了大哥
			memcpy(a + i, tmp + i, sizeof(int) * (end2-i+1));
		}
		printf("\n");
		gap = gap * 2;
	}
}


int main()
{
	int a[] = { 10,6,7,1,3,9,4,2,9,8,7 };
	int n = sizeof(a) / sizeof(a[0]);
	int* tmp = (int*)malloc(sizeof(int) * n);
	if (tmp == NULL)
	{
		perror("malloc fail");
		return;
	}
	MergeSortNonR(a, 0, n - 1, tmp);
    PrintSort(a, n);
	free(tmp);
	return 0;
}

 

时间复杂度

时间复杂度:O(N*logN) 

归并排序在硬盘上的应用(外排序)

  • 内部排序:数据元素全部放在内存中的排序。
  • 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。(硬盘)
  • 归并排序既是内排序,也是外排序。

  • 内存和硬盘的区别?
  • 为什么归并排序可以是外排序,其他排序只能是内排序?
  • 为什么数据要放到硬盘里面?
  • 大量的数据在文件中保存,如果用归并排序使其有序?

🙂感谢大家的阅读,若有错误和不足,欢迎指正。关于归并排序作为外排序在文件中的应用,后面的补充内容会详细讲解。

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

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

相关文章

浅谈Unity内存管理

浅谈Unity内存管理 前言 很早之前记录的Unity内存相关的知识点&#xff0c;在此补充到博客上来。有什么不对的地方欢迎指正探讨。 内存概念 虚拟内存&#xff08;Virtual Memory&#xff09; 众所周知&#xff0c;物理内存就是插在计算机主板内存槽上的实际物理内存。 虚拟…

SAP中分包后续调整应用实例二(调减)

之前己写过一篇介绍过分包后续调整功能MB04的基本应用。当时的场景是某个原材料由于各方面原因&#xff08;比如没有维护到BOM中&#xff09;&#xff0c;在委外加工模式成品收货后&#xff0c;并没有消耗或少消耗&#xff0c;这时可以用该事务功能来补充消耗。在生产报工中的M…

redis八股

文章目录 数据类型字符串实现使用场景 List 列表实现使用场景 Hash 哈希实现使用场景 Set 集合实现使用场景 ZSet 有序集合实现使用场景 BitMap实现使用场景 Stream使用场景pubsub为什么不能作为消息队列 数据结构机制SDS 简单动态字符串压缩列表哈希表整数集合跳表quicklistli…

CleanMyMac2024永久免费mac电脑版本安装包下载

CleanMyMac 4 for Mac&#xff1a;细致入微的功能介绍&#xff0c;CleanMyMac 4 for Mac作为一款系统清理和优化工具&#xff0c;提供了丰富而细致的功能&#xff0c;旨在满足Mac用户在不同场景下的清理和优化需求。以下是对CleanMyMac 4功能的更加细化介绍&#xff1a; CleanM…

苍穹外卖 -- day10- Spring Task- 订单状态定时处理- WebSocket- 来单提醒- 客户催单

苍穹外卖-day10 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代…

CVE-2021–27065漏洞分析及复现

接着昨天的说 CVE-2021–27065 CVE-2021–27065是⼀个任意⽂件写⼊漏洞&#xff0c;它需要登陆的管理员账号权限才能触发。而CVE-2021–26855正好可以为我们提供了管理员账号权限。 登录管理员账号后,进入:服务器——>虚拟目录——>OAB 编辑OAB配置,在外部链接中写⼊s…

蜣螂优化算法DBO求解不闭合SD-MTSP,可以修改旅行商个数及起点(提供MATLAB代码)

一、蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09; 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得…

【加密算法】AES对称加密算法简介

目录 前言 工作原理 SubBytes ShiftRows MixColumns AddRoundKey 应用场景 在Java中使用AES 加密和解密数据 注意事项和最佳实践 结论 前言 AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称加密算法&#xff0c;它在密码学中被广泛应用。AES取代…

数学建模入门必看|关于2024第九届数维杯数学建模,你想知道的都在这里!

数维杯大学生数学建模挑战赛每年分为两场&#xff0c;每年上半年为数维杯国赛&#xff08;5月&#xff0c;俗称小国赛&#xff09;&#xff0c;下半年为数维杯国际赛(11月)&#xff0c;2023年第八届数维杯大学生数学建模挑战赛共有近1.4万名学生参赛&#xff0c;参赛队伍来自国…

【总第49篇】2.3深度学习开发任务实例(2)机器学习和深度学习的对比【大厂AI课学习笔记】

机器学习和深度学习都是用于图片分类任务的强大工具&#xff0c;但它们采用的方法和原理有所不同。下面我将分别解释这两种技术是如何应用于图片分类的&#xff0c;并着重讨论深度学习中的卷积概念。 机器学习在图片分类中的应用 传统的机器学习方法在进行图片分类时&#xf…

【论文阅读】Vison-Language Navigation 视觉语言导航(1)

ACL 2022 VLN视觉和语言导航&#xff1a;任务、方法和未来方向综述 多模态任务新蓝海&#xff1a;视觉语言导航最新进展 Leader board in VLN RXR&#xff1a; Room-across-Room (RxR) is a large-scale, multilingual dataset for Vision-and-Language Navigation (VLN) in…

北邮毕业论文Latex模板使用教程(Windows)

1latex模板下载 下载地址&#xff1a; https://github.com/rioxwang/BUPTGraduateThesis2安装编译环境 TEX Live 2014 或者CTEX 2.9.2.164&#xff0c;以及更高的版本. 下载其中一个即可 &#xff08;1&#xff09;TEX Live下载地址&#xff1a; https://tug.org/texlive/acq…

网络初识(概念入门)

目录 1.局域网VS广域网 1.1局域网 1.2广域网 2.五元组 2.1 IP和端口 2.1.1 IP 2.1.2端口号 2.2协议 3.协议分层 4. TCP/IP五层模型 5.封装和分用 5.1封装 5.2分用 1.局域网VS广域网 1.1局域网 简单介绍&#xff1a;指在某一特定区域内由多台计算机组成的互联网组…

GDB动态调试学习-2-【断点】

文章目录 在程序地址上打断点在程序入口处打断点获取程序入口地址 在命名空间设置断点命名空间给命名空间的函数下断电 在文件行号上打断点保存已经设置的断点设置临时断点设置条件断点command指令 忽略断点 在程序地址上打断点 当调试汇编程序&#xff0c;或者没有调试信息的…

docker创建mongodb数据库容器

介绍 本文将通过docker创建一个mongodb数据库容器 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本&#xff0c;可以选择安装此版本。 2. 创建并启动主数据库 容器数据卷配置 /docker/mongodb/master/data # 数据库数据目录&#xff08;宿主机&am…

vue + koa + 阿里云部署 + 宝塔:宝塔前后端部署

接上篇&#xff0c;我们已经完成了宝塔的基本配置&#xff0c;下面我们来看如何在宝塔中部署前后端 一、上传前后端代码文件 在www > wwwroot目录下创建了一个demo文件&#xff0c;用来存放前后端代码 进入demo中&#xff0c;点击上传 这里前端我用的打完包的 dist文件&am…

微信公众号关键词自动回复

今天主要给大家讲一下如何实现微信公众号关键词的自动回复功能&#xff0c;就如网站的文章而言&#xff0c;进行人机识别&#xff0c;需要关注公众号回复验证码获取到验证码从而展示文章内容&#xff0c;&#xff0c;具体效果如下图。 springboot 2.3.2RELEASE 1、微信公众平台…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

vue3 使用qrcodejs2-fix生成二维码并可下载保存

直接上代码 <el-button click‘setEwm’>打开弹框二维码</el-button><el-dialog v-model"centerDialogVisible" align-center ><div class"code"><div class"content" id"qrCodeUrl" ref"qrCodeUrl&q…

设计模式-结构型模式-组合模式

组合模式&#xff08;Composite Pattern&#xff09;&#xff1a;组合多个对象形成树形结构以表示具有“部分—整体”关系的层次结构。组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c;又可以称…