排序算法之归并排序

本文详细介绍了归并排序算法的工作原理及其实现过程。通过逐步分解和合并有序子数组,最终达到整个数组有序的状态。文章提供了具体的Java代码示例,帮助读者理解归并排序的基本思想。

归并排序也是使用了分治法的一种排序算法。

首先先来看如何将两个有序数组合并起来。假设有两个有序数组a[1,4,7],b[2,5,6],数组c的长度为6用来放合并完后的数据。现在要将它们合并,首先比较a[0]与b[0]的大小,

a[0]<b[0]则c[0] = a[0],接下来在比较a[1]与b[0],a[1]>b[0]则c[1] = b[0],接下来比较a[1]与b[1]的大小然后用c来存放。以此类推。

java代码实现为:

<span style="white-space:pre">	</span>/**
	 * @param a 数组a
	 * @param aLength 数组a的长度
	 * @param b 数组b
	 * @param bLength 数组b的长度
	 * @param c 数组c用来存放合并后的数据
	 */
	public static void memeryArray(int[] a, int aLength, int[] b, int bLength, int[] c){
		int i = 0;//遍历数组a用的下标
		int j = 0;//遍历数组b用的下标
		int k = 0;//遍历数组c用的下标
		int n = aLength;//数组a的长度,即数组a需要遍历的长度大小
		int m = bLength;//数组b的长度,即数组b需要遍历的长度大小
		
		//其中一个数组遍历完成,则循环停止,到下面两个while循环
		while(i < n && j < m){
			//通过比较将小的先放在c里面
			if(a[i] < b[j]){
				c[k++] = a[i++];
			} else {
				c[k++] = b[j++];
			}
		}
		
		//b数组遍历完了,a还剩下,则将a剩下的直接按顺序放入c
		while(i < n){
			c[k++] = a[i++];
		}
		
		//a数组遍历完了,b还剩下,则将b剩下的直接按顺序放入c
		while(j < m){
			c[k++] = b[j++];
		}
	}

归并排序的思路也是如此将有序的数组合并起来最终得到有序数组,例如有一个数组a[9, 5, 7, 6, 8, 3, 10],当每个部分只有一个数的时候它便是有序的了。先看如何将无序数组归并成有序数组。思路如下:

{(9), (5), (7), (6), (8), (3), (10)}

{(5, 9), (6, 7), (3, 8), (10)}

{(5, 6, 7, 9), (3, 8, 10)}

{(3. 5. 6. 7. 8. 9. 10)}

然后剩下的就是如何将无序数组分割成一个数一组在合并起来了。java代码如下:

<span style="white-space:pre">	</span>public static void memerySort(int[] data, int start, int end, int[] temp){
		//如果start<end则还没有分成一个数一组
		if(start < end){
			//将数组从中间分开,然后在对左右两部分继续分
			int middle = (end + start)/2;
			memerySort(data, start, middle, temp);
			memerySort(data, middle + 1, end, temp);
			//合并有序数组
			MemeryArray(data, start, middle, end, temp);
		}
	}

<span style="white-space:pre">	</span>public static void memeryArray(int a[], int start, int middle, int end, int temp[]){  
		 int i = start;//左边数组起始位置
		 int j = middle + 1;//右边数组起始位置
		 int m = middle;//左边数组结束位置
		 int n = end;//右边数组结束位置
		 int k = 0;//temp数组存放数据的下标起始位置
	    while (i <= m && j <= n)
	    {  
	        if (a[i] <= a[j])  
	        	temp[k++] = a[i++];  
	        else  
	        	temp[k++] = a[j++];   
	    }  
	  
	    while (i <= m)  
	    	temp[k++] = a[i++];  
	  
	    while (j <= n)  
	    	temp[k++] = a[j++]; 
	    
	    //将数组a下标由start到end范围内的数据放入已排序好的temp
	    for (i = 0; i < k; i++)
	        a[start + i] = temp[i];
	}

下载前可以先看下教程 https://pan.quark.cn/s/a4b39357ea24 在网页构建过程中,表单(Form)扮演着用户与网站之间沟通的关键角色,其主要功能在于汇集用户的各类输入信息。 JavaScript作为网页开发的核心技术,提供了多样化的API和函数来操作表单组件,诸如input和select等元素。 本专题将详细研究如何借助原生JavaScript对form表单进行视觉优化,并对input输入框与select下拉框进行功能增强。 一、表单基础1. 表单组件:在HTML语言中,<form>标签用于构建一个表单,该标签内部可以容纳多种表单组件,包括<input>(输入框)、<select>(下拉框)、<textarea>(多行文本输入区域)等。 2. 表单参数:诸如action(表单提交的地址)、method(表单提交的协议,为GET或POST)等属性,它们决定了表单的行为特性。 3. 表单行为:诸如onsubmit(表单提交时触发的动作)、onchange(表单元素值变更时触发的动作)等事件,能够通过JavaScript进行响应式处理。 二、input元素视觉优化1. CSS定制:通过设定input元素的CSS属性,例如border(边框)、background-color(背景色)、padding(内边距)、font-size(字体大小)等,能够调整其视觉表现。 2. placeholder特性:提供预填的提示文字,以帮助用户明确输入框的预期用途。 3. 图标集成:借助:before和:after伪元素或者额外的HTML组件结合CSS定位技术,可以在输入框中嵌入图标,从而增强视觉吸引力。 三、select下拉框视觉优化1. 复选功能:通过设置multiple属性...
【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)内容概要:本文围绕“基于深度强化学习的微能源网能量管理与优化策略”展开研究,重点探讨了如何利用深度强化学习技术对微能源系统进行高效的能量管理与优化调度。文中结合Python代码实现,复现了EI级别研究成果,涵盖了微电网中分布式能源、储能系统及负荷的协调优化问题,通过构建合理的奖励函数与状态空间模型,实现对复杂能源系统的智能决策支持。研究体现了深度强化学习在应对不确定性可再生能源出力、负荷波动等挑战中的优势,提升了系统运行的经济性与稳定性。; 适合人群:具备一定Python编程基础和机器学习背景,从事能源系统优化、智能电网、强化学习应用等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微能源网的能量调度与优化控制,提升系统能效与经济效益;②为深度强化学习在能源管理领域的落地提供可复现的技术路径与代码参考;③服务于学术研究与论文复现,特别是EI/SCI级别高水平论文的仿真实验部分。; 阅读建议:建议读者结合提供的Python代码进行实践操作,深入理解深度强化学习算法在能源系统建模中的具体应用,重点关注状态设计、动作空间定义与奖励函数构造等关键环节,并可进一步扩展至多智能体强化学习或与其他优化算法的融合研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值