Java排序算法总结之(四)——归并排序

外部归并排序Java实现 NULL 博文链接:https://yeelor.iteye.com/blog/1964843 立即下载

排序方法可以分为两种:内部排序 和 外部排序

内部排序的方法很多,常用的大致可以分为:

  1. 插入排序(直接插入排序、折半插入排序、希尔排序)
  2. 交换排序(冒泡排序、快速排序)
  3. 选择排序(简单选择排序、堆排序)
  4. 归并排序
  5. 基数排序

归并排序:

基本思想:将两个或两个以上的有序表组合成一个新的有序表。

归并的思路很好理解,有下面的示例:

示例:

           

Java代码:

public class MSort {
	public static void sort(int[] s) {
		int[] reg = new int[s.length];// 创建一个寄存器数组,存储排好序数组,之后再复制给原数组
		merge(s, reg, 0, s.length - 1);// 调用merge函数实现归并
	}

	private static void merge(int[] s, int[] reg, int left, int right) {
		if (left >= right)// 递归出口,当left = right时,即单个元素进行比较
			return;

		int mid = left + ((right - left) >> 1);// 每次对数组取半,前后分别排序
		int left2 = mid + 1;// 后部分从mid + 1开始,到right
		int left1 = left;// 前部分从left 开始,到mid
		merge(s, reg, left1, mid);
		merge(s, reg, left2, right);

		int n = left;// 用于更新数组 reg 中已排好序的数据
		while (left1 <= mid && left2 <= right) {// 依次比较前后两部分的数据,并存入reg 中
			reg[n++] = s[left1] < s[left2] ? s[left1++] : s[left2++];
		}
		while (left1 <= mid) {// 将合并后余下数组中的数据存入reg 中
			reg[n++] = s[left1++];
		}
		while (left2 <= right) {
			reg[n++] = s[left2++];
		}
		for (n = left; n <= right; n++) {// 将排好序的数组赋给原数组
			s[n] = reg[n];
		}
	}
}


相关推荐

解决用VScode写中文注释,Vivado打开之后是乱码的方法

这样就解决了中文注释乱码的问题,此外如果使用notepad++写verilog代码的话直接在notepad++上面将编码格式改为ANSI格式即可,更加方便快捷,所以此方法仅针对习惯用VScode写Verilog的同学,如果有其他好办法的话欢迎评论区补充。首先,VScode中的中文默认编码格式是UTF-8,然后Vivado的编码格式是vivado 默认的应该是ANSI编码格式,刚开始我先按照网上说明的,将VScode中的编码格式改为GBK格式(点击右下角->点击通过编码保存)。

weixin_50573305的博客 5813

排序算法总结之归并排序

一,归并排序介绍 归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时) ,将划分的有序子数组合并成一个更大的有序数组。为什么是有序子数组??? 归并排序的递归公式:T(N) = 2T(N/2) + O(N) 从公式中可以看出:将规模为 N 的原问题分解成两个规模 N/2 ...

weixin_34167819的博客 222

深入浅出:UE4类型系统完整构建过程详解

UE4的类型系统是一个复杂但设计精巧的架构,它通过静态代码生成和运行时构建的完美配合,实现了强大的反射功能。理解这个过程不仅有助于解决开发中的问题,也能让你更好地利用UE4的各种高级特性。就像建造一栋大楼需要经过设计、备料、框架、装修、验收等多个阶段,UE4类型系统的构建也是一个多阶段、精细化的过程。每个阶段都有其特定的职责,共同协作完成从源代码到运行时对象的转换。

m0_45371381的博客 911

归并排序(Java实现)

归并排序是一种高级排序算法,适用于外部排序,时间复杂度为O(nlogn),但是由于必须引入辅助数组,空间复杂度为O(n)

Hackeryuan的博客 569

携程景点评论数据爬取实战:破解AJAX动态加载与分页参数逆向分析

本文详细介绍了携程景点评论数据爬取的实战经验,重点破解了AJAX动态加载与分页参数逆向分析的技术难题。通过分析`getCommentCollapseList`接口,解析动态参数如`poiId`和`pageIndex`,并实现分页逻辑,帮助开发者高效获取评论数据。文章还提供了完整的Python爬虫代码和反爬策略,适用于数据分析与内容挖掘。

weixin_29098367的博客 674

S32DS使用手把手教程:从零实现CAN通信配置

深入讲解S32DS使用过程中如何从零开始配置CAN通信,涵盖关键步骤与实用技巧,帮助开发者快速上手S32DS使用中的常见问题与调试方法。

weixin_42405592的博客 1126

排序算法Java实现——归并排序

归并排序(也可以叫合并排序),其实归并排序的本质就是合并排序。 它是与插入排序、交换排序、选择排序不同的一类排序方法,不同之处在于: 它要求:待排序序列是由若干个有序子序列组成。 那么究竟什么是归并排序呢?归并这个词到底是什么意思? 首先可以理解为就是合并,然后就是这个词的由来,可以说归并这个词是个生造词。 “归并”由merge翻译而来,所以归并排序亦可以翻译为:”合并排序“。因为此算法的

你只管努力, 3025

Altium Designer差分走线实战:从规则设置到阻抗匹配的完整流程

本文详细讲解了在Altium Designer中进行差分走线的完整实战流程,涵盖从原理图定义差分对、PCB布局管理、关键设计规则设置,到利用阻抗计算工具确定线宽与间距,以及布线技巧与等长处理等核心步骤。文章旨在帮助工程师掌握高速PCB设计中差分信号传输的关键技术,确保信号完整性并实现精确的阻抗匹配。

weixin_29163857的博客 257

排序算法Java代码实现(四)—— 归并排序

本篇内容: 归并排序 归并排序 算法思想: 将两个或两个以上的有序表合并成一个新的有序表, 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列. 此算法分为两步: (1)把数组等长切分; (2)把切分后的数组进行排序,然后合并; 通过切分方法的递归调用,可以将数组切分到最小(2个元素)的组合; 代码: (1)合并两...

weixin_30763397的博客 91

Python自动化测试报告:飞书群机器人消息卡片实战

本文详细介绍了如何利用Python和飞书群机器人实现自动化测试报告的智能通知。通过构建可定制的消息卡片,将测试结果(如通过数、失败数)以清晰、美观的格式自动推送至团队群聊,并支持一键跳转查看详细报告,从而显著提升团队协作与问题响应效率。

k6l7m8n9的博客 811

Android OTA 更新面试题及参考答案

OTA 更新即空中下载技术(Over-the-Air Technology)更新,是一种通过无线网络对移动设备的系统软件或应用程序进行远程更新的技术手段。其原理是设备通过移动网络或 Wi-Fi 连接到服务器,服务器检测设备上可更新的软件版本,当有新的版本时,将更新包发送到设备上。设备接收后,在后台自动完成更新包的下载、安装等一系列操作,无需用户手动下载完整的系统镜像或应用安装包并通过数据线等方式进行安装。例如,当手机厂商推出新的安卓系统版本或安全补丁时,就会通过 OTA 方式推送给用户。

大模型大数据攻城狮的专栏 1630

排序算法小结(四)——归并排序(Java实现)

排序算法小结(四)——归并排序

xx2014301318的博客 315

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1675

算法(Java实现)-图解十大经典排序算法(四)——归并排序

1、归并排序 1.1归并排序介绍 归并排序(MERGE-SORT) :是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程 算法描述: 把长度为n的输入序列分成两个长度为n/2

jQueryZK的博客 2396

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java八大排序算法(四)之归并排序

图解排序算法(四)之归并排序基本思想  归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。分而治之   可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采...

将来的你一定会感谢现在努力的自己 256

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

七大排序算法详解——排序(四)归并排序(附Java代码)

排序:所谓排序,就是使一串记录,按照其中的某个或某几个关键字的大小,递增或递减排列起来的操作。稳定性:在待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的。内部排序:把数据全部加载到内存中进行排序。外部排序:数据太多,内存不能存储了,将数据放到磁盘、U盘上进行排序。

m0_63793861的博客 175

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

排序算法之归并排序

归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

9288

排序算法(四):归并排序

归并排序作为一种经典的分治算法,在处理大规模数据时展现了其强大的性能和稳定性。它通过递归地分割和合并来实现排序,其时间复杂度为O(n log n),是一个理想的稳定排序算法。尽管它的空间复杂度较高,且实现相对复杂,但在许多应用场景中,归并排序仍然是一个非常有效的排序工具。在选择排序算法时,我们可以根据实际情况选择合适的算法,例如对于大规模数据或者需要稳定排序的场景,归并排序无疑是一个优选。而对于小规模数据,插入排序或快速排序可能会更高效。

一碗黄焖鸡三碗米饭的博客 1250

Java 与排序算法(5):归并排序

归并排序(Merge Sort)是一种基于分治思想的排序算法。它将待排序的数组分成两个长度相等的子数组,然后对这两个子数组分别进行归并排序,最后将两个排好序的子数组合并成一个有序的数组。

暗星涌动 3619

Java排序算法之<归并排序>

归并排序是一种采用分治法的高效排序算法。其时间复杂度为O(nlogn),空间复杂度为O(n),具有稳定性。算法通过递归地将序列二分至单个元素,再两两合并有序子序列完成排序。具体实现包括:申请同等大小的临时数组、递归分组、比较合并等步骤。文中提供了完整的Java代码示例,展示了序列[28,19,8...9]的完整排序过程,最终输出有序结果[8,9,10...28]。该算法适合处理大规模数据,但需要额外存储空间。

weixin_50055999的博客 1374

<排序算法四>快速掌握“(2路)归并排序”

快速掌握递归排序的递归、非递归实现,复杂度

a1302993809的博客 1437

图解排序算法(四)之归并排序

基本思想   归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 分而治之   可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。 合并相邻有序子序列   再...

qq_40826814的博客 140

Java排序算法之归并排序

Java排序算法之归并排序算法概述归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段

Science Explorer 497

java排序算法之归并排序

一、排序算法概述 常用的内部排序方法有:交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、归并排序、基数排序(一关键字、多关键字)。 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。 选择排序算法的依据:任何排序算法在数据量小的时候基本体现不出来差距。选择依据有 1.数...

孔子说 428

java泛型中使用的排序算法——归并排序及分析

一、引言 我们知道,java中泛型排序使用归并排序或TimSort。归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度;也会简述为什么java选择归并排序作为泛型的排序算法。 二、图解归并排序过程 算法思想:采用分治法: 分割:递归地把当前序列平均分割成两半。 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。 归并操作:指的是将两个已经...

weixin_34080903的博客 217
上一篇: Java排序算法总结之(三)——选择排序(简单选择排序、堆排序)
下一篇: Java排序算法总结之(五)—— 基数排序
Appletable
博客等级 码龄14年 0粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值