Java之归并排序

news2024/11/16 20:43:17

归并排序

归并排序(Merge Sort)算法,使用的是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。

核心源码: mergeSort(m->n) = merge(mergeSort(m->k),mergeSort(k+1->n));

算法思路:

​ 如果要排序一个数组,先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。具体见下图:

在这里插入图片描述

注意:分治思想跟递归思想很相似。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突,分治算法一般都是用递归来实现。

具体代码实现如下:

import java.util.Arrays;
import org.junit.Test;

/**
 * 
* @ClassName: MergeSort
* @author shaoyb
* @date 2020年12月9日
* @Description: 归并排序
* 归并排序思路:
*	1、把长度为n的序列一分为二成两个子序列;
	2、对这两个子序列分别采用归并排序;
	3、将两个排序好的子序列合并成一个最终的排序序列。
 */
public class MergeSort {
	
	/**
	 * 归并排序算法实现
	 * @param arr 需要排序的数组
	 * @return 排序成功后新数组
	 */
	public int[] mergeSort(int[] arr){
		//1.确定递归终止条件
		if(arr.length < 2) {
			return arr;
		}
		
		//2.拆解数组成左右两部分
		int mid = arr.length/2;
		int[] left = Arrays.copyOfRange(arr,0,mid);
		int[] right = Arrays.copyOfRange(arr,mid,arr.length);
		
		//3.对拆解后两个数组进行合并
		return merge(mergeSort(left),mergeSort(right));
	}
	
	/**
	* 合并两个有序数组,并返回合并后的新数组
	* @param left
	* @param right
	*/
	public int[] merge(int[] left,int[] right) {
		//1.定义好新数组
		int[] newArray = new int[left.length + right.length];
		
		//2.往新数组中逐个添加元素
		int lIndex = 0;
		int rIndex = 0;
		for(int i = 0; i < newArray.length; i++) {
			if(lIndex >= left.length) {
				//左数组已经遍历完成
				newArray[i] = right[rIndex++];
			}else if(rIndex >= right.length) {
				//右数组已经遍历完成
				newArray[i] = left[lIndex++];
			}else if(left[lIndex] < right[rIndex]) {
				//左数组当前元素值小于右数组
				newArray[i] = left[lIndex++];
			}else {
				//右数组当前元素值小于左数组
				newArray[i] = right[rIndex++];
			}
		}
		
		return newArray;
	}
		
	@Test
	public void testMergeSort(){
		//1.定义数组
		int[] array = new int[] {5,2,6,9,0,3};
		
		System.out.println("排序前" + Arrays.toString(array));
		
		//2.归并排序
		array = mergeSort(array);
		
		System.out.println("排序后" + Arrays.toString(array));
	}	
}

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

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

相关文章

对于500强企业来说,有比FTP好用的传输工具吗?

500强企业在进行文件传输时&#xff0c;会根据其业务需求、数据安全性要求以及技术架构的不同&#xff0c;选择多种文件传输方式&#xff0c;最常见的便是FTP。然而FTP在使用却存在较多的问题&#xff1a; 1&#xff09;安全性问题 缺乏安全策略&#xff1a;FTP本身不提供加密…

「百年孤独」

引言 《百年孤独》是加西亚马尔克斯创作的魔幻现实主义经典小说&#xff0c;刻画了布恩迪亚家族七代人的跌宕起伏和马孔多小镇的兴衰。是拉丁美洲文学中一部不朽的杰作。 故事概述 小说从布恩迪亚家族的始祖荷塞阿卡迪奥布恩迪亚和妻子乌尔苏拉开始&#xff0c;讲述了七代人…

DeiT III(Meta)论文解读

paper&#xff1a;DeiT III: Revenge of the ViT official implementation&#xff1a;https://github.com/facebookresearch/deit 出发点 本研究旨在重新审视ViT的监督训练方法&#xff0c;并提出一种基于ResNet-50训练方法的简化版新训练策略。与现有的自动数据增强方法不…

C++从入门到起飞之——友元内部类匿名对象对象拷贝时的编译器优化 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1、友元 2、内部类 3、 匿名对象 4、对象拷⻉时的编译器优化 5、完结散花 1、友元 • 友元提供…

springAOP理解及事务

AOP&#xff1a; springAOP是什么&#xff1a; AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 使用场景&#xff1a; 比如你想统计业务中每个方法的执行耗时&#xff0c;那我们最…

基于bert的自动对对联系统

目录 概述 演示效果 核心逻辑 使用方式 1.裁剪数据集 根据自己的需要选择 2.用couplet数据集训练模型 模型存储在model文件夹中 3.将模型转换为ONNX格式 4.打开index.html就可以在前端使用此自动对对联系统了。 本文所涉及所有资源均在传知代码平台可获取。 概述 这个生成器利用…

什么是婚恋聊天交友源码?今天大家讲解一下。源码交付,支持二开,可打包APP小程序H5。

婚恋交友APP开发前景 对于现代的年轻人来说&#xff0c;社恐已经是深入骨子里不可别除的&#xff0c;除了每天上班下班&#xff0c;许多人宁愿宅在家里&#xff0c;面对线下的相亲机构&#xff0c;家里长辈介绍的会都是饭度抗柜的。而这几年疫情的影响更是大大的限制了正常的社…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

7. 运行时数据区-栈

栈的分类 栈分为Java虚拟机栈还有本地方法栈&#xff1a; Java虚拟机栈&#xff1a;用于保存Java中的方法相关的内容本地方法栈&#xff1a;用于保存在Java中使用native 标记的用C来实现方法 由于hotspot的作者发现使用一个栈就可以保存以上两个部分的内容&#xff0c;所以在…

图像生成中图像质量评估指标—PSNR的详细介绍

文章目录 1. 背景介绍2. 实际应用3. 总结和讨论 1. 背景介绍 峰值信噪比&#xff08;Peak Signal-to-Noise Ratio&#xff0c;简称PSNR&#xff09;是一种广泛应用于图像和视频处理领域的客观图像质量评价指标。它主要用于衡量图像的噪声水平和图像质量&#xff0c;可以用来评…

HttpClient初学

介绍&#xff1a; HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和建议。 这里阿里云的oss依赖底层是httpclient&#xff0c;所以这里不再重…

用f-string+sys.stdout.write定制“自己的writer”

f-stringsys.stdout.write&#xff0c;在python中“随意”我的输出。 (笔记模板由python脚本于2024年07月29日 08:09:35创建&#xff0c;本篇笔记适合喜欢python并有一定基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&am…

dotnet开发编译之争:Ahead-of-Time(AOT) vs Just-in-Time(JIT)谁才是未来最佳编译选择?

1. 前言 编译技术的选择对于现代应用程序的性能至关重要。在.Net开发平台下&#xff0c;选择合适的编译策略对于提升应用程序的响应速度、资源利用率以及最终用户体验有着不可忽视的影响。其中&#xff0c;Ahead-of-Time (AOT) 编译和 Just-in-Time (JIT) 编译是两种广泛采用的…

【编程工具使用技巧】VS如何显示行号

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《编程工具与技巧探索》 期待您的关注 目录 引言 一、VS编译器行号显示的基本步骤 1.打开VS与项目 2.进入选项设置 3.找到并…

Open3D 计算点到平面的距离

目录 一、概述 1.1原理 1.2实现步骤 1.3原理 二、代码实现 1.1关键函数 1.2完整代码 三、实现效果 3.1原始点云 3.2计算距离后赋色的点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#…

【更新2022】省级农业科技活动人员数测算 2009-2022无缺失

省级农业科技活动人员数测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先&#xff0c;这些数据可用于分析省级农业科技活动的规模和结构变化&#xff0c;揭示不同地区在农业科技投入和产出方面的差异&#xff0c;为政府制定农业发展政策…

锅总浅析系统设计

如何进行系统设计&#xff1f;系统设计最佳实践有哪些&#xff1f;系统设计和软件工程有何区别&#xff1f;如何避免过度设计&#xff1f;学习书籍及软件工具推荐有哪些&#xff1f;前后端语言选型有哪些原则&#xff1f;考虑政策因素的系统设计步骤是怎样的&#xff1f; 带着这…

三维推:二维码生成与修改、加logo、设置有效期

进入后台&#xff0c;找到【二维码工具】下的【二维码在线生成】&#xff0c;可以看到&#xff0c;三维推支持网址、图片、音频、视频、文件以及模板生成二维码。 这里&#xff0c;我们以网址生成二维码为例来演示下&#xff0c;如何给二维码加logo、更改颜色等。 首先&#x…

操作系统---进程调度算法相关习题

例题1&#xff1a;某系统采用基于优先权的非抢占式进程调度策略&#xff0c;完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1、P2和P3&#xff0c;其在就绪队列中的等待时间、需要的 CPU 时间和优先权如下表所示。 若优先权值大的进程优先获得CP…