数据结构排序——归并排序递归与非递归

news2025/1/13 2:24:54

基本思想:

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤: 

 

1.递归方法

void guipai1(int* a, int* tem, int left, int right)
{
	if (left >= right)
		return;
	int mid = (left + right) / 2;
	guipai1(a, tem, left, mid);
	guipai1(a, tem, mid+1, right);
	int begin1 = left;
	int begin2 = mid + 1;
	int end1 = mid;
	int end2 = right;
	int i = left;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1] > a[begin2])
		{
			tem[i++] = a[begin2++];
		}
		else
		{
			tem[i++] = a[begin1++];
		}
	}
	while (begin1 <= end1)
	{
		tem[i++] = a[begin1++];
	}
	while (begin2 <= end2)
	{
		tem[i++] = a[begin2++];
	}
	memcpy(a+left, tem+left, sizeof(int) * (right-left+1));
}

归并排序的最后一次排序要求begin1到end1与begin2到end2之间都是都是有序的,这便要求我们要在最后一次之前,将这些变为有序的内容,所以我先将递归放到最前面,这边要求我们递归到只有1到2个数字之间进行比较,并将这些数字重新排进一个新的地方储存,然后就是从头开始4个4个比较,然后是8个比较。这里我将i的初始值定为left,是因为比较的初始值可能从中间开始,那么我将a数组的值的下标便与tem的下标对应起来了,下面的循环与我以前写的《有序合并2》的文章是一个代码,只不过这里是将一个数组分成两块,因为我通过递归将两块分开,让两块的数字分别变的有序的,

memcpy(你要拷贝到的起始位置,模版的起始位置,你要拷贝多少个字节)

2.非递归方法 (这种方法只适合数组个数是2^n的情况)

void guipai2(int* a,int *tem, int n)
{
	//每一组归并的个数
	int gap = 1;
	int i;
	while (gap < n)
	{
		for (i = 0; i < n; i+=gap*2)
		{
			int begin1 = i;
			int begin2 = i+gap;
			int end1 = i+gap-1;
			int end2 = i+2*gap-1;
			int j = i;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] > a[begin2])
				{
					tem[j++] = a[begin2++];
				}
				else
				{
					tem[j++] = a[begin1++];
				}
			}
			while (begin1 <= end1)
			{
				tem[j++] = a[begin1++];
			}
			while (begin2 <= end2)
			{
				tem[j++] = a[begin2++];
			}
			memcpy(a + i, tem + i, sizeof(int) * (end2-i+1));
		}
		gap = gap * 2;
	}
}

i循环是为了确认初始的位置,gap是一组归并的个数(因为我将归并分成了两份,这里gap是一份的数量) 。

归并排序的特性总结:

1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

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

3. 空间复杂度:O(N)

4. 稳定性:稳定 

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

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

相关文章

CANopen协议的理解

本文的重点是对CANopen协议的理解&#xff0c;不是编程实现 参考链接 canopen快速入门 1cia301协议介绍_哔哩哔哩_bilibili CANopen是什么&#xff1f; CANopen通讯基础&#xff08;上&#xff09;_哔哩哔哩_bilibili CANopen概述 图1. CAN报文标准帧的格式 CAN的报文可简单…

50projects50days案例代码分析学习、效果,Html+CSS+JavaScript小案例

案例来源于&#xff1a;https://github.com/bradtraversy/50projects50days&#xff0c;部分资源需要科学上网加载使用&#xff0c;往后不再赘述。 合集链接&#xff0c;欢迎订阅&#xff1a; https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzkwODY2OTA5NA&actiongetal…

Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具

关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具&#xff0c;旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器&#xff0c;该解析器处理标记化和语法树解析以及众多自定义属性&#x…

35岁失业后:靠这几个AI副业,也能养活自己

最近几年连续的经济下行&#xff0c;到现在已经彻底传导到所有行业&#xff0c;波及到越来越多的人… 这种波及&#xff0c;最集中反映在失业率上&#xff0c;今年又是1179万应届生毕业即失业&#xff0c;加入到庞大的就业漩涡中&#xff0c;35岁裁员已成常态。 大环境确实如此…

RocketMQ 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 RocketMQ 特点 RocketMQ 优势 1. RocketMQ 基本概念 1.1 NameServer 1.1.1 NameServer作用 1.1.2 和zk的区别 1.1.3 高可用保障 1.2 Broker 1.2.1 部署方式 1.2.1.1 单 Master 1.2.1.2 …

OpenAI推出o1,一个能够自我事实核查的模型

ChatGPT的开发者OpenAI宣布了其下一次重大产品发布&#xff1a;一个代号为“Strawberry”&#xff08;草莓&#xff09;的生成式AI模型&#xff0c;正式名称为OpenAI o1。 更准确地说&#xff0c;o1实际上是一个模型家族。周四&#xff0c;两个版本将在ChatGPT和OpenAI的API中…

最新kubernetes的安装填坑之旅(新手篇)

Kubernetes&#xff08;常简称为 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序&#xff0c;lz也不知道哪根脑经秀逗了&#xff0c;竟然妄挑战学习一下&#xff0c;结果折戟沉沙&#xff0c;被折腾的欲仙欲死&#xff0c;不过…

26577flask旧衣物捐赠系统—计算机毕业设计源码26577

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

【鸿蒙开发从0到1 day10】

ArkUI布局高级 一.线性布局1.间距(space)2.主轴对齐方式3.交叉轴对齐方式4.单个子组件交叉轴的对齐方式5.自适应缩放6.侧轴对齐方式7.案例 二.弹性布局1.淘宝网页面案例分析 三.总结 一.线性布局 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0…

海鲜市场|基于springboot的网络海鲜市场系设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已…

HyperWorks二维网格划分及拓扑改进

Step 01&#xff1a;载入模型 Exercise_3a.hm。 Step 02&#xff1a;2D 网格划分。 进入 automesh 面板。 图 3-13 设置 automesh 面板网格控制参数 (2) 指定 element size 为 5&#xff0c;根据图 3-13 设置网格控制参数。 (3) 查看网格。 图 3-14 新创建的网格模型 网格…

计算机组成原理(二) —— Cache 高速缓存

这篇主要讲一下高速缓存&#xff0c;涉及到高速缓存的几种形式&#xff0c;缓存友好代码注意事项&#xff0c;多处理器下缓存的同步机制。 文章目录 存储器层次结构高速缓存存储器通用的高速缓存存储器组织结构直接映射高速缓存组选择行匹配字选择不命中时的行替换冲突不命中 组…

半个月赚3000+,用AI做仙侠场景账号,全网分发

那些看过的仙侠剧、修仙小说&#xff0c;玩过的仙侠游戏&#xff0c;你还记得吗&#xff1f; 仙侠类型之所以让人津津乐道&#xff0c;除了不同于普通人的人物形象塑造以及跌宕起伏的剧情之外&#xff0c;美轮美奂的仙境场景也是重中之重。所以&#xff0c;每个人心中都有独属于…

Qt Model/View之Model

在检查如何处理选择之前&#xff0c;您可能会发现检查模型/视图框架中使用的概念很有用。 基本概念 在模型/视图架构中&#xff0c;模型提供了一个标准接口&#xff0c;用于视图和委托访问数据。在Qt中&#xff0c;标准接口由QAbstractItemModel类定义。无论数据项如何存储在…

ListBox显示最新数据、左移和右移操作

1、程序 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static Sys…

《餐饮世界》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《餐饮世界》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《餐饮世界》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a; 中国商业联合会 主办单位&am…

b√最大矩阵和

题目描述 给定一个二维整数矩阵&#xff0c;要在这个矩阵中选出一个子矩阵. 使得这个子矩阵内所有的数字和尽量大&#xff0c;我们把这个子矩阵称为和最大子矩阵 子矩阵的选取原则是原矩阵中一块相互连续的矩形区域。 输入描述 输入的第一行包含2个整数n,m(1< n,m< 10…

Mysql连接不上的问题?

Mysql服务器本地能访问&#xff0c;但是外部连接报错如下&#xff1a;显然我也知道这就是一个权限问题&#xff0c;但是在网上百度的方法要么就是不生效&#xff0c;要么就是执行命令报错&#xff0c;很抓狂&#xff5e;这里提供精准的解决方案&#xff1a;SELECT User, Host F…

EV代码签名证书签名指南,签名要求、签名步骤一览

作为软件开发者&#xff0c;在软件分发之前&#xff0c;为软件应用程序进行代码签名&#xff0c;可标识开发者身份&#xff0c;消除“未知发布者”警告&#xff0c;确保代码完整性&#xff0c;有利于应用程序安全分发&#xff0c;也可以让用户放心下载。而为软件应用程序进行代…

【C语言从不挂科到高绩点】17-C语言中的宏定义

Hello&#xff01;彦祖们&#xff0c;俺又回来了&#xff01;&#xff01;&#xff01;&#xff0c;继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中的函数&#xff1a; 本套课程将会从0基础讲解C语言核心技术&#xff0c;适合人群&#xff1a; 大学…