基于Java实现的归并排序算法

归并排序(Merge Sort)是一种典型的分治思想的应用,它将待排序的序列划分为若干个子序列,每个子序列是一个有序的序列。然后再把有序子序列合并为整体有序序列。归并排序的时间复杂度为O(nlogn),是一种非常高效的排序算法。本文将详细介绍归并排序的基本思想、实现步骤,并通过Java语言给出具体的实现代码。

一、归并排序的基本思想

归并排序的基本思想是将两个(或两个以上)有序表合并成一个新的有序表。即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序的过程可以分为三个步骤:

  1. 分解:将数组分解成两个较小的子数组,直到子数组的大小为1。
  2. 递归进行排序并合并:递归地对子数组进行排序,并将已排序的子数组合并成一个大的有序数组,直到合并为1个完整的数组。
  3. 合并:将两个有序数组合并成一个有序数组。

二、归并排序的实现步骤

以下是归并排序的具体实现步骤:

  1. 申请空间:申请一个与原始数组一样大小的空间,用于存放合并后的数组。
  2. 定义分界点:确定两个子数组的分界点。
  3. 使用循环:使用循环将两个子数组中的数据按大小顺序依次放到新数组中。
  4. 合并:将两个子数组合并成一个有序数组。
  5. 递归进行:将上述过程递归进行,先使每个子序列有序,再使子序列段间有序。

三、基于Java的归并排序实现

下面是一个基于Java的归并排序实现示例:

public class MergeSort {// 归并排序主函数public static void mergeSort(int[] arr) {if (arr == null || arr.length < 2) {return;}mergeSortInternal(arr, 0, arr.length - 1);}// 归并排序内部实现,用于递归private static void mergeSortInternal(int[] arr, int left, int right) {if (left < right) {// 找出中间索引int mid = left + (right - left) / 2;// 对左半部分递归进行排序mergeSortInternal(arr, left, mid);// 对右半部分递归进行排序mergeSortInternal(arr, mid + 1, right);// 合并两个有序数组merge(arr, left, mid, right);}}// 合并两个有序数组private static void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1]; // 申请一个临时数组int i = left; // 左指针int j = mid + 1; // 右指针int k = 0; // 临时数组的指针// 把较小的数先移到新数组中while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 把左边剩余的元素移到新数组中while (i <= mid) {temp[k++] = arr[i++];}// 把右边剩余的元素移到新数组中while (j <= right) {temp[k++] = arr[j++];}// 把新数组中的元素复制回原数组for (int p = 0; p < temp.length; p++) {arr[left + p] = temp[p];}}// 测试代码public static void main(String[] args) {int[] arr = {38, 27, 43, 3, 9, 82, 10};mergeSort(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}

四、归并排序的性能分析

归并排序的时间复杂度是O(nlogn),其中n是待排序数组的长度。这是因为归并排序每次都将数组分为两半进行递归排序,然后将两个有序子数组合并成一个有序数组。这个过程的时间复杂度是递归的,可以通过主定理(Master Theorem)来分析得出。

归并排序的空间复杂度是O(n),其中n是待排序数组的长度。这是因为归并排序在合并两个有序子数组时需要申请一个与原始数组一样大小的临时数组来存放合并后的结果。在最坏情况下,递归调用栈的深度可以达到O(logn),但由于每次递归调用都会释放相应的内存空间,因此递归调用栈所占用的空间并不是归并排序空间复杂度的主要部分。

归并排序是一种稳定的排序算法,即相等的元素在排序后保持原有的顺序不变。这是因为归并排序在合并两个有序子数组时,是按照大小顺序依次将元素放入新数组的,如果两个元素相等,那么左子数组中的元素会先被放入新数组,从而保持了原有的顺序。

五、归并排序的优缺点

优点:

  1. 时间复杂度为O(nlogn),是一种非常高效的排序算法。
  2. 稳定性好,相等的元素在排序后保持原有的顺序不变。
  3. 适用于各种类型的数据,包括链表、数组等。

缺点:

  1. 空间复杂度为O(n),需要申请额外的空间来存放合并后的结果。
  2. 在数据量较小的情况下,归并排序的性能可能不如一些简单的排序算法(如插入排序、选择排序等)。

六、归并排序的应用场景

归并排序适用于对大数据量进行排序的场景,特别是在需要保证稳定性的情况下。由于归并排序的时间复杂度为O(nlogn),因此它可以在较短的时间内对大量数据进行排序。同时,归并排序的稳定性使得它在处理一些需要保持元素顺序的问题时具有很大的优势。例如,在数据库查询、文件管理等场景中,经常需要对大量数据进行排序,并且需要保持数据的稳定性,这时就可以使用归并排序来解决。

七、总结

归并排序是一种基于分治思想的排序算法,它将待排序的序列划分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序的时间复杂度为O(nlogn),空间复杂度为O(n),是一种非常高效的排序算法。同时,归并排序的稳定性使得它在处理一些需要保持元素顺序的问题时具有很大的优势。在实际应用中,我们可以根据具体的需求和场景来选择使用归并排序或其他排序算法。

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

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

相关文章

webserver服务器从零搭建到上线(六)|Timestamp类和InetAddress类

本节我们重点来谈论&#xff1a; 时间类和我们的初始化链接地址类 文章目录 Timestamp类成员函数实现 InetAddress类具体实现 Timestamp类 我们为什么要封装一个时间类呢&#xff1f; 这也是一个大型项目必须的基础组建&#xff0c;这样我们不仅可以提高代码的可读性&#xf…

侧缝计怎么安装_测缝计安装方法介绍

测缝计作为土木工程和结构健康监测中常用的仪器&#xff0c;用于测量裂缝或接缝的张开和闭合情况。正确的安装是确保测缝计能够准确、可靠地工作的关键。本文将详细介绍测缝计的安装方法&#xff0c;以确保测量结果的准确性和可靠性。 上传中 点击输入图片描述&#xff08;最多…

Qt for android 串口库使用

简介 由于Qt for android并没有提供android的串口执行方案&#xff0c;基于需要又懒得自己去造轮子&#xff0c; 使用开源的 usb-serial-for-android 库进行串口访问读写。 如果有自己的需要和库不满足的点&#xff0c;可以查看库的底层调用的Android相关API C/C 串口库 对应…

01Python相关基础学习

Python基础 模块相关导入模块sys模块 模块相关 导入模块 1. import 模块名 2. import 模块名 as 别名 3. from 模块名 import 成员名 as 别名sys模块 1. sys.argv 介绍: 实现从程序的外部想程序传递参数返回的是一个列表,第一个元素是程序文件名,第二个元素是程序外部传入的…

c++面试题记录(语言基础)

面向对象的程序设计思想是什么&#xff1f; 答&#xff1a;把数据结构和对数据结构进行操作的方法封装形成一个个的对象。 在头文件中进行类的声明&#xff0c;在对应的实现文件中进行类的定义有什么意义&#xff1f; 答&#xff1a;这样可以提高编译效率&#xff0c;因为分开的…

RabbitMQ(一)概述第一个应用程序

文章目录 概述AMQP和JMS官网安装开始第一个程序 概述 消息队列是实现应用程序和应用程序之间通信的中间件产品 AMQP和JMS 工作体系 官网 https://www.rabbitmq.com/ RabbitMQ是一款基于AMQP、由Erlang语言开发的消息队列产品 安装 # 拉取镜像 docker pull rabbitmq:3.13-m…

民国漫画杂志《时代漫画》第7期.PDF

时代漫画07.PDF: https://url03.ctfile.com/f/1779803-1247458105-0a2c41?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

Java进阶学习笔记23——API概述

API&#xff1a; API&#xff08;Application Programming Interface&#xff09;应用程序编程接口 就是Java帮我们写好了一些程序&#xff1a;如类、方法等等&#xff0c;我们直接拿过来用就可以解决一些问题。 为什么要学别人写好的程序&#xff1f; 不要重复造轮子。开发…

哈希表详解及模拟实现(unordered_map)

目录 认识哈希表&#xff1a; 哈希冲突&#xff1a; 除留余数法--(常用) 平方取中法--(了解) 折叠法--(了解) 随机数法--(了解) 泛型编程&#xff1a; 闭散列&#xff1a; 线性探测&#xff1a; 二次探测&#xff1a; 扩容&#xff1a; 查找&#xff1a; 插入&#…

PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法

PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法 吃鸡热潮依旧绝地求生PUBG可是咱们玩家的心头好啊&#xff01;不过有时候可能会遇到点小麻烦&#xff0c;比如PUBG绝地求生卡在初始界面 登不上去 打不开游戏的解决办法。小编这就给大家分享几个超实用的解决方法&…

小猫类(静态成员)

定义一个小猫类&#xff0c;包含私有数据成员&#xff1a;小猫的重量&#xff0c;小猫的总数和猫的总重量&#xff0c;公有成员函数&#xff1a;设置小猫的重量&#xff0c;设置小猫的总数和总重量&#xff0c;获取小猫的总数&#xff0c;输出小猫信息等。 编写main函数完成类的…

LDRA Testbed(TBrun)软件单元测试_操作指南

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

YOLOv10来了

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 前言 YOLOv10 由清华大学研究人员在 Ultralytics版基础上进行进一步开发&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了以前版本 YOLO 在后处理和模型架构方面的不足。通过消除非最大…

[8] CUDA之向量点乘和矩阵乘法

CUDA之向量点乘和矩阵乘法 计算类似矩阵乘法的数学运算 1. 向量点乘 两个向量点乘运算定义如下&#xff1a; #真正的向量可能很长&#xff0c;两个向量里边可能有多个元素 (X1,Y1,Z1) * (Y1,Y2,Y3) X1Y1 X2Y2 X3Y3这种原始输入是两个数组而输出却缩减为一个(单一值)的运…

linux 查看csv文件,按指定列聚合 排序

在Linux中&#xff0c;你可以使用awk工具来查看CSV文件的内容&#xff0c;并按照指定的列进行聚合。awk是一种强大的文本处理工具&#xff0c;它可以处理文本文件中的数据&#xff0c;并根据条件执行相应的操作。 以下是一个示例&#xff0c;假设你有一个名为data.csv的CSV文件…

单点登录(JWT实现)

单点登陆的英文名是&#xff1a;Single Sign On&#xff08;简称SSO&#xff09;&#xff0c;只需要登陆一次&#xff0c;就可以访问所有信任的应用系统。 在单体项目中&#xff0c;我们登陆之后可以把验证用户信息的值放入session中&#xff0c;单个tomcat中的session是可以共…

43-1 应急响应 - Windows入侵排查实验

环境准备: 1. 我这里使用CS随便生成一个木马,然后复制到windows虚拟机中运行黑客必备利器:如何在系统上安装和使用 CobaltStrike(简称:CS)_cobalt strike-CSDN博客 2. 然后在windows靶机中给这个木马文件设置计划任务schtasks /create /tn MyTask /tr "C:\Users\Ad…

C++ 数据结构算法 学习笔记(33) -查找算法及企业级应用

C 数据结构算法 学习笔记(33) -查找算法及企业级应用 数组和索引 日常生活中&#xff0c;我们经常会在电话号码簿中查阅“某人”的电话号码&#xff0c;按姓查询或者按字母排 序查询&#xff1b;在字典中查阅“某个词”的读音和含义等等。在这里&#xff0c;“电话号码簿”和…

【FPGA】Verilog:2-bit 二进制比较器的实现(2-bit binary comparator)

解释 2-bit 二进制比较器仿真结果及过程说明(包括真值表和卡诺图) 真值表和卡洛图如下: 2-bit Binary Comparator A1 A2 B1

写好的文章怎样联系媒体投稿?

作为单位信息宣传的桥梁,我肩负着将单位的每一次活动、每一项成就转化为社会认可与赞美的重任。初涉此职,我满腔热血,以为凭借扎实的文字功底与不懈的努力,便能在各大媒体平台上为单位赢得一席之地。然而,现实很快就给了我一记响亮的耳光。 我最初采取的是最直接的方式——邮箱…