归并的递归和非递归排序

【论文阅读1】机理引导的残差学习用于电池全生命周期状态监测 | Nature Communications 本文提出了一种机理引导的残差学习框架,用于提升电池全生命周期内荷电状态(SOC)和健康状态(SOH)的监测精度。该方法融合等效电路模型的先验知识与机器学习,设计了修正模型和补偿模型两种通用框架。实验验证表明,该方法在三种不同类型电池数据集上均表现出色,SOC和SOH估计误差较传统方法降低50%以上,且在未见工况下仍保持良好外推能力。模型具有强鲁棒性,在减少训练数据量和降低采样频率时性能稳定,并兼具物理可解释性。该框架无需离线测试和运行中校准,为电池安全监测提供了有效解决方案。 阅读详情

1.归并排序递归

从中间将一整个数组分成两个数组,假设这两个数组已经完成了排序,那么设立一个新的数组,取两个数组各自第一个数据进行比较,那个数组的数据小就放入这个新建的数组,然后再重新在这个数组取数,再和另外一个数组原来取的数进行比较,那个小那个就放入这个新建的数组,直到有一个数组的数被取完,那么另外一个数组的全部数据都将依次放入新建的组,再将新建的数组的数据mencpy到原数组中就完成了排序,

那么要怎么使两边的数组都是有序的呢???

请看VCR

通过以上的递归方式实现排序,当递归的数只剩两个那么这两边就是有序的那么这两边就能进行比较排序,进行完比较排序了之后就返回这个数组,然后其它的数组也一样返回,所有返回完毕便实现了数组的排序。

代码实现如下

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
void _MergeSort(int* a,int* temp,int left,int right)
{
	if (left >= right)
	{
		return;
	}
	int mid = (right + left) / 2;
	int begin1 = left;
	int begin2 = mid+1;
	int end1 = mid;
	int end2 = right;

	_MergeSort(a, temp, begin1, end1);
	_MergeSort(a, temp, begin2, end2);
	int i = begin1;
	while (begin1 <= end1 && begin2 <= end2)
	{
		if (a[begin1]<a[begin2])
		{
			temp[i++] = a[begin1++];
		}
		else
		{
			temp[i++] = a[begin2++];
		}
	}
	while (begin1 <= end1)
	{
		temp[i++] = a[begin1++];
	}
	while (begin2<=end2)
	{
		temp[i++] = a[begin2++];
	}
	memcpy(a + left, temp + left, sizeof(int) * (right - left + 1));
}
void MergeSort(int* a, int n)
{
	int left = 0, right = n - 1;
	int* temp = (int*)malloc(sizeof(n));
	
	_MergeSort(a, temp, left, right);
}

 2.归并排序非递归

归并排序非递归就是先将数组两个两个进行排序,再四个四个进行,再八个八个进行。直到数组被分为两组排序那么就结束。

代码实现如下 

void MergeSortNonR(int* a, int n)
{
	int* temp = (int*)malloc(sizeof(int) * n);
	if (temp == NULL)
	{
		perror("malloc");
		return;
	}
	int gap = 1;
	while (gap < n)
	{
		for (int i = 0; i < n; i = i + gap * 2)
		{
			int begin1 = i, end1 = i + gap - 1;
			int begin2 = i + gap, end2 = i + 2 * gap - 1;
			if (end1 >= n-1)
			{
				break;
			}
			if (end2 >= n-1)
			{
				end2 = n - 1;
			}
			int j = begin1;
			while (begin1 <= end1 && begin2 <= end2)
			{
				if (a[begin1] < a[begin2])
				{
					temp[j++] = a[begin1++];
				}
				else
				{
					temp[j++] = a[begin2++];
				}
			}
			while (begin1 <= end1)
			{
				temp[j++] = a[begin1++];
			}
			while (begin2 <= end2)
			{
				temp[j++] = a[begin2++];
			}
			memcpy(a + i, temp + i, sizeof(int) * (end2 - i + 1));//没有搞清楚begin1和i,begin1会变

		}
		gap = gap * 2;
	}
}

但是排序时要注意,因为访问位置是2的倍数增加,当数组个数不是二的倍数时就会造成越界访问,所以在上述代码中增加了如下代码。 

			if (end1 >= n-1)
			{
				break;
			}
			if (end2 >= n-1)
			{
				end2 = n - 1;
			}

Harmony:C# 动态代码补丁的5大秘密武器 Harmony 是一个开源库,它允许你在运行时修改托管代码(即使用 .NET 或 Mono 编译的语言编写的应用程序)。它通过利用 AOP(面向切面编程)的思想,可以在不重新编译代码的情况下添加、替换或修改方法的行为。这对于游戏模组(Modding)、插件开发以及调试工具非常有用。安装 Harmony要使用 Harmony,你需要首先安装它。Harmony 作为一个 NuGet 包,可以直接通过 Visual Studio 的 NuGet 包管理器进行安装。安装步骤打开 Visual Studio。 阅读详情

相关推荐

【无人机智能避障】基于深度强化学习的城市复杂环境路径规划实战

本文探讨了基于深度强化学习的无人机在城市复杂环境中的智能避障与路径规划。针对传统算法难以应对动态与非结构化障碍的痛点,文章详细介绍了如何利用DQN算法,通过设计合理的状态空间、奖励函数,并结合经验回放、目标网络等技巧,训练无人机自主学会在楼宇间安全、高效飞行的策略。

weixin_28224217的博客 737

归并排序(递归和非递归方法)

重点图解实现归并排序的2种方法(递归和非递归版)(含全部代码); 归并排序可以进一步被划分为分割和归并两个步骤。分割是将数组二等分,得到的子数组继续二等分,直到每个子数组只剩下一个元素为止。而归并则是不断将原本属于同一个数组的两个子数组归并成一个新的有序表。

好作息,好心态,多锻炼,多学点,多钻研 1481

PyTorch复现EEG-TCNet踩坑记:从BCI IV2a数据到TCN块缺失的完整解决方案

本文详细解析了使用PyTorch复现EEG-TCNet模型的全过程,重点解决了BCI IV2a数据集预处理和TCN模块缺失的技术难题。通过标准化数据流程、跨受试者验证策略以及三种因果卷积实现方案,为运动想象分类任务提供完整解决方案,帮助研究者高效实现模型复现与优化。

weixin_30699955的博客 319

归并排序递归方法和非递归方法详解

归并排序递归方法和非递归方法详解

Xpccccc的博客 1972

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1644

快速排序和归并排序中一趟的理解(递归和非递归)

引:2019年408中数据结构一道考察快速排序的选择题 定位:这道题在考察快速排序中一趟的概念。 思路: 回想教材(《数据结构》严)里对一趟的定义 算法描述: 可见第一张图的过程实际上是递归形式实现的快排第一次调用Partition函数产生的结果。 然而,我们知道,如果第一次选中的pivot处在了待排序元素最终结果中的中间位置。那么接下来的处理也是递归进行的, 如图(a)所示,在第一次调用Patition函数后,元素49被放到了最终位置,之后对49左侧位置元素调用Qsort进行处理

Kazzan的博客 1万+

YOLO11涨点优化:特征融合改进 | 引入BiFPN (双向特征金字塔) 加权融合机制,自适应分配不同尺度特征权重

YOLO11与BiFPN特征融合技术解析 本文深入剖析了YOLO11目标检测架构及其BiFPN特征融合机制的关键创新。2024年发布的YOLO11通过C3k2模块、SPPF池化和C2PSA注意力机制,在COCO数据集上以更少参数实现更高精度。研究发现传统FPN+PAN结构存在特征融合权重分配不均和计算冗余问题,而BiFPN通过双向跨尺度连接和加权融合机制实现了突破: 架构创新:BiFPN采用剪枝策略、跳跃连接增强和层级重复叠加,优化信息流动路径 加权融合:提出快速归一化融合算法,动态分配特征权重,相比Sof

2601_95807009的博客 176

归并排序的递归和非递归

归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 关键词:分解、归并、分治、物理上数组、逻辑上二叉树 思路: 把长度为n的输入序列分成两个长度为n...

紫阳战君的博客 1133

【DaVinci Developer工具实战】03 -导入xml文件

本文档描述了 DaVinci Developer 导入数据的的具体功能 ,它适用于导入AUTOSAR SWC 模板【AUTOSAR XML 文件】 文件。

1992

虚拟电厂功率预测最佳实践白皮书

虚拟电厂(VPP)通过聚合分散的可再生能源资源,为电网提供可观测、可调度和可交易的解决方案。本文提出了一套功率预测方法论,并给出LSTM实现脚本,涵盖资源接入、数据治理、预测模型设计及市场交易闭环。针对风-光-储-负荷混合场景,该方法论强调轻量化部署和滚动优化,可有效提升预测精度和调度收益。未来研究将融合深度气象预报和强化学习,进一步优化VPP的协同调度能力。

专注AI大模型,软件混淆,授权 377

排序算法进阶——归并排序【详细图解,递归和非递归】

再比较两个序列的第一个元素的大小,将小的那一个元素放在申请的空间的第一个【假设排升序】,再让放入的那个元素之后的一个元素与那个第一次比较时没放入的元素比较,再把小的那一个放入申请空间的第二个位置上…归并算法一般应用于合并两个已经有序的序列,使合并后的序列也有序,是一个时间复杂度为O(N)的算法,不过一般要借助两个要排序的序列的元素个数个额外的空间。归并排序采用分治策略,将序列递归地分成短序列,然后将各个有序的短序列合并成一个有序的长序列,不断合并直到原序列全部排好序。

2301_80058734的博客 3313

【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程

法如faro Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。

智慧空间实验室 2385

排序算法:归并排序(递归和非递归)

归并排序使用递归的实现方法以及在递归版本中的小区间优化版本,归并排序的非递归实现(两个改进的版本)!

Yikefore的博客 2959

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

十大排序算法(中):冒泡排序,快速排序(递归和非递归)、归并排序(递归和非递归)

万字详解冒泡、快排(递归非递归)、归并(递归非递归)!进来看看!

m0_73594607的博客 2240

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

归并排序的递归和非递归方法总结

归并排序的递归和非递归算法

a815331793的专栏 4569

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

归并排序三种实现方法(递归、非递归和自然合并排序)

1.      递归实现归并排序 1)     基本思想: 将待排元素分成大小大致相同的2个子集,分别对2个子集合进行排序,最终将排好序的子集合合并 就会得到一个排好序的集合 即为所求 设归并排序的当前区间是R[low..high],分治法的三个步骤是: ① 分解:将当前区间一分为二,即求分裂点  ② 求解:递归地对两个子区间R[low..mid]和R[mid+1..high] 进行归并

Christine的专栏 1万+

快速排序的非递归写法和优化,归并排序的非递归写法

非递归和优化快速排序非递归优化1、 优化基准值的选择2、减少递归次数3、结合堆排序 快速排序 非递归 本质上需要用非递归模拟递归,借助一个栈 import java.util.Arrays; import java.util.Stack; public class quickSort { public static void quickSort(int[] array){ //栈中保存的元素相当于当前要进行partition操作的范围下标 Stack<Inte

char_m的博客 502

归并排序的递归和非递归实现

归并排序递归和非递归实现

Latecomessnow的博客 523

【排序知多少】归并排序(递归和非递归实现)

归并排序思路 1、将待排序元素一分为二 2、对于左半边和右半边元素分别再次进行拆分,直到无法再拆 3、把拆分过的元素进行重新排序并且合并 4、合并之后最终的数组即为排序之后的数组 归并排序理解 归并排序适用了完全二叉树排序的想法,将带排列数组逐层均分,尽可能分成完全二叉树的形式,再把每组查分的元素从最底层开始,逐层向上的合并起来,直到再次和成一个有序的数组,即完成整个排序过程。 归并...

不了痕的博客 1406

【C/排序算法】:快速排序和归并排序的非递归实现

3.1.首先要先把数组。

2301_77900444的博客 2236

快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。原理:规定左指针,cur指针,右指针。当a[cur] < key时,把a[cur]和a[left]的值交换cur++,left++。然后往栈里压有区间,压左区间,就像树的后续遍历一样先把叶子区间处理,再处理分支节点的区间。稳定的排序算法:冒泡排序,计数排序,归并排序,直接插入排序。不稳定的排序算法 :堆排序,快速排序,选择排序,希尔排序。空间复杂度O(范围)

m0_67635008的博客 2315

【数据结构】归并排序的非递归写法和计数排序

我们大家应该都了解归并排序,而且可以很容易地将归并排序的递归形式写出,但是在面试或其他情况下,可能会考察我们非递归的写法,在这一篇博客中,我们会记录到如何写出归并排序非递归的写法,以及另一种排序方法:计数排序。

加油,考上985的研究生 1204

排序算法之归并排序(递归和非递归版)

归并排序讲解

m0_64770095的博客 845

【C语言】归并排序递归和非递归——动图演示

归并排序的时间复杂度是On∗lognO(n*logn)On∗logn,空间复杂度是OnO(n)On归并排序非递归的越界处理是难点,需要多加画图和调试分析情况,才能很好控制越界问题。

Eraser的博客 1090

【数据结构】归并排序、快速排序(递归法和非递归法)

排序算法是基础,但是,对于归并排序和快速排序,其思想方法的理解是重中之重,而且不光要掌握递归法,对非递归法也要有所了解。本文详细介绍了归并排序,以及三种实现快速排序的方法。与此同时,对两种排序算法的非递归法也进行了细致的分析,相信看完一定有所收获!

m0_65679465的博客 1533
上一篇: 数组快排的四种方法
下一篇: C++namespace
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值