深入了解归并排序:原理、性能分析与 Java 实现

news2025/1/11 6:57:22

归并排序(Merge Sort)是一种高效且稳定的排序算法,其优雅的分治策略使它成为排序领域的一颗明珠。它的核心思想是将一个未排序的数组分割成两个子数组,然后递归地对子数组进行排序,最后将这些排好序的子数组合并起来。

mergesort.jpg

什么是归并排序?

归并排序是一种分治策略的排序算法,它的核心思想是将数组分成两个子数组,递归地对子数组进行排序,然后将排序好的子数组合并起来,最终得到有序的数组。归并排序的关键步骤包括:

  1. 分割阶段: 将数组分成两个子数组,通常是平均分割。

  2. 递归排序: 递归地对左右两个子数组进行排序。

  3. 合并阶段: 将排好序的子数组合并成一个新的有序数组。

mergesort.png

归并排序的性能分析

归并排序在性能方面有以下特点:

  • 时间复杂度: 归并排序的平均、最好和最坏情况下时间复杂度均为 O ( n l o g n ) O(n log n) O(nlogn),这使它成为高效的排序算法。

  • 空间复杂度: 归并排序通常需要额外的内存空间来存储临时数据,因此其空间复杂度为 O ( n ) O(n) O(n)

  • 稳定性: 归并排序是稳定的排序算法,相等元素的相对顺序在排序后不会改变。

  • 适用场景: 归并排序适用于各种数据规模和数据类型,特别适用于外部排序,如大文件的排序。

Java 代码实现

以下是使用 Java 实现归并排序的示例代码:

public class Test {

    public static void main(String[] args) {
        int[] arr = new int[]{7,5,2,3,6,4};
        System.out.println("原始数组:"+ Arrays.toString(arr));
        mergeSort(arr);
        System.out.println("排序后的数组:"+ Arrays.toString(arr));
    }

    // 归并排序的入口方法
    public static void mergeSort(int[] arr) {
        // 针对特殊情况,数组为空或只有一个元素时,无需排序
        if(arr == null || arr.length <= 1  ){
            return;
        }
        // 创建一个临时数组用于归并操作
        int[] temp = new int[arr.length];

        // 调用实际的排序方法,传入数组、左边界、右边界和临时数组
        sort(arr, 0, arr.length - 1, temp);
    }

    // 归并排序的核心排序方法(递归调用的方法)
    public static void sort(int[] arr,int left,int right,int[] temp) {
        //递归终止的条件
        if(left < right){
            //计算中间位置分割的下标
            int mid = (right + left) / 2;
            // 递归对左半部分进行排序
            sort(arr, left, mid, temp);
            // 递归对右半部分进行排序
            sort(arr, mid+1, right, temp);
            //合并
            merge(arr,left,mid,right,temp);
        }

    }


    // 归并排序的核心归并方法
    public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
        int i = left;
        int j = mid + 1;
        int k = left;

        // 比较左右两部分的元素,并将较小的元素放入临时数组
        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 l = left; l <= right; l++) {
            arr[l] = temp[l];
        }
    }

}

输出结果:

原始数组:[7, 5, 2, 3, 6, 4]
排序后的数组:[2, 3, 4, 5, 6, 7]

这段代码演示了如何使用 Java 实现归并排序算法。它通过递归将数组分割为子数组,然后合并这些子数组,最终得到排序完成的数组。

总结

总之,归并排序是一种高效、稳定的排序算法,适用于各种规模和类型的数据。虽然它的空间复杂度较高,但在实际应用中,它的性能通常非常出色。这使得它成为排序算法家族中的重要一员。

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

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

相关文章

在JavaScript中,什么是IIFE(Immediately Invoked Function Expression)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

现代化战机之路:美国空军U-2侦察机基于Jenkins和k8s的CI/CD架构演进

▲ 点击上方"DevOps和k8s全栈技术"关注公众 华为北京研究所Q27大楼 随着技术的不断进步&#xff0c;军事领域也在积极采纳现代化工具来提高战备水平和效率。美国空军的U-2侦察机项目是一个鲜明的例子&#xff0c;它成功地借助Jenkins和Kubernetes&#xff08;k8s&…

Oracle修改数据之后提交事务如何回滚?

在 MySQL 和 Oracle 数据库中&#xff0c;事务提交后都无法回滚。 在 MySQL 中&#xff0c;恢复机制是通过回滚日志&#xff08;undo log&#xff09;实现的&#xff0c;所有事务进行的修改都会先记录到这个回滚日志中&#xff0c;然后在对数据库中的对应行进行写入。当事务已经…

IDE环境要注意统一编码,否则出现中文乱码找不到头绪

最近遇到在IDEA开发项目时&#xff0c;保存中文为乱码的现象&#xff0c;如图&#xff1a; 看了项目配置文件的编码都是UTF-8&#xff0c;在别的开发机上运行都正常&#xff0c;就是这台机器上有问题。 同事一时也找不到方法&#xff0c;因为没遇到同样的事情。 一直怀疑是编…

Spring源码解析——IOC之循环依赖处理

什么是循环依赖 循环依赖其实就是循环引用&#xff0c;也就是两个或则两个以上的bean互相持有对方&#xff0c;最终形成闭环。比如A依赖于B&#xff0c;B依赖于C&#xff0c;C又依赖于A。如下图所示&#xff1a; 注意&#xff0c;这里不是函数的循环调用&#xff0c;是对象的相…

tcpdump(三)命令行参数讲解(二)

一 tcpdump实战详解 骏马金龙tcpdump详解 强调&#xff1a; 注意区分选项参数和过滤条件 本文继上篇 网卡没有开启混杂模式 tcpdump默认开启混杂模式 --no-promiscuous-mode --> 可以指定在非混杂模式抓包 ① -vv 控制详细内容的输出 ② -s -s 长度: 可以只…

基于Java的社区生鲜在线电商平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

【排序算法】选择排序

文章目录 一&#xff1a;基本介绍1.1 概念1.2 算法思想1.3 思路分析图1.4 思路分析1.5 总结1.5.1 选择排序一共有数组大小-1轮排序1.5.2 每一轮排序&#xff0c;又是一个循环&#xff0c;循环的规则如下&#xff08;在代码中实现&#xff09;&#xff1a; 二&#xff1a;代码实…

大数据——Spark Streaming

是什么 Spark Streaming是一个可扩展、高吞吐、具有容错性的流式计算框架。 之前我们接触的spark-core和spark-sql都是离线批处理任务&#xff0c;每天定时处理数据&#xff0c;对于数据的实时性要求不高&#xff0c;一般都是T1的。但在企业任务中存在很多的实时性的任务需求&…

C#,数值计算——数据建模Fitexy的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Fitexy { private double a { get; set; } private double b { get; set; } private double siga { get; set; } private double sigb { get; set; } …

快速搭建Springboot项目(一)

目录 第一章、Spring Boot框架介绍1.1&#xff09;Springboot是什么&#xff0c;有什么好处1.2&#xff09;spring boot的两大策略与四大核心 第二章、快速搭建spring boot 项目2.1&#xff09;idea快速创建spring boot项目2.2&#xff09;pom文件内容的含义2.3&#xff09;起步…

195、SpringBoot--配置RabbitMQ消息Broker的SSL 和 管理控制台的HTTPS

开启Rabbitmq的一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件&#xff0c;就是启动登录rabbitmq控制台的页面 rabbitmq_management 代表了RabbitMQ的管理界面。 rabbitmq-server 启动rabbitMQ服务器 上面这个&…

springboot中的静态资源规则~

静态资源处理&#xff1a; 默认的静态资源路径为 calsspath:/META-INF/resources/ classpath:/resources/ classpath:/static/ classpath:/public/如果我们将静态资源放置上述四种路径处&#xff0c;那么可以通过项目根路径/静态资源名称的方式访问到&#xff0c;否则会访问不…

Oracle-ASM实例communication error问题处理

问题背景&#xff1a; Oracle数据库日志出现大量的WARNING: ASM communication error: op 0 state 0x0 (15055)错误 问题分析: 首先检查ASM实例的状态,尝试通过sqlplus / as sysasm连接asm实例&#xff0c;出现Connected to an idle instance连接asm实例失败 检查ASM实例的后台…

mysql面试题27:数据库中间件了解过吗?什么是sharding jdbc、mycat,并且讲讲怎么使用?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:数据库中间件了解过吗,比如sharding jdbc、mycat? 我知道的数据库中间件有以下这些: MySQL Proxy:MySQL Proxy是一个开源的数据库中间件,它位…

SSM170基于SSM的疫情物质管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

怎么禁止windows server2003系统中的用户进行本地登陆

随着科技的发展&#xff0c;电脑已经成为人们日常生活中必不可少的工具&#xff0c;电脑系统也在逐步更新&#xff0c;这就导致了许多人对于陌生的系统都不知道应该怎么办&#xff1f;当我们在使用windows server2003时&#xff0c;如何设置用户禁止本地登陆呢&#xff1f;接下…

【Linux初阶】多线程1 | 页表的索引作用 线程基础

本文要点 再次理解页表&#xff0c;了解页表是如何利用虚拟地址进行索引&#xff0c;实现数据读取和传输的了解线程概念&#xff0c;线程的优缺点&#xff0c;线程异常的后果了解线程和进程的差异了解线程库及其基本调用接口&#xff08;进程创建、终止、等待、控制&#xff0…

SQL sever中的视图

目录 一、视图概述&#xff1a; 二、视图好处 三、创建视图 法一&#xff1a; 法二&#xff1a; 四、查看视图信息 五、视图插入数据 六、视图修改数据 七、视图删除数据 八、删除视图 法一&#xff1a; 法二&#xff1a; 一、视图概述&#xff1a; 视图是一种常用…

如何使用 Datree 避免 Kubernetes 错误配置

Kubernetes 是一个复杂的系统,具有许多移动部件。正确的配置规则对于您的服务可靠运行至关重要。当您在没有经过全面审查过程的情况下手动编写 Kubernetes 清单时,可能会出现错误。 Datree是一个基于规则的工具,可以自动查找清单中的问题。您可以使用它来发现策略违规行为,…