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

一、归并排序

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

具体实现过程如下:

  1. 将待排序的数组分成两个长度相等的子数组;
  2. 对这两个子数组分别进行归并排序,即递归地调用归并排序函数;
  3. 将两个排好序的子数组合并成一个有序的数组。

在这里插入图片描述

二、归并排序的性质

归并排序具有以下性质:

  1. 稳定性:归并排序是一种稳定的排序算法,即相等元素的相对位置在排序前后不会发生改变。

  2. 时间复杂度:归并排序的时间复杂度为 O(nlogn),其中 n 表示待排序数组的长度。归并排序的时间复杂度比较稳定,不会因为数据的分布情况而产生较大的波动。

  3. 空间复杂度:归并排序的空间复杂度为 O(n),其中 n 表示待排序数组的长度。归并排序需要额外的空间来存储归并过程中的临时数组,因此空间复杂度比较高。

  4. 适用性:归并排序适用于所有数据类型,尤其适用于链表数据结构。在链表数据结构中,归并排序的空间复杂度可以优化为 O(1)。

  5. 可并行性:归并排序具有很好的可并行性,可以将待排序数组分成多个子数组,分别进行排序,最后将排序好的子数组合并成一个有序的数组。

三、归并排序的变种

归并排序有以下几种变种:

  1. 自然归并排序(Natural Merge Sort):自然归并排序是归并排序的一种变种,它可以对已经部分有序的数组进行排序,从而提高排序效率。自然归并排序的基本思想是将待排序数组中已经有序的子序列合并成一个更大的有序序列,然后再将这些有序序列合并成一个完整的有序序列。

  2. 两路归并排序(Two-Way Merge Sort):两路归并排序是归并排序的一种变种,它可以在原地进行排序,即不需要额外的空间来存储归并过程中的临时数组。两路归并排序的基本思想是将待排序数组分成两个子数组,然后将这两个子数组合并成一个有序的数组。

  3. 多路归并排序(Multi-Way Merge Sort):多路归并排序是归并排序的一种变种,它可以对多个有序数组进行排序,从而提高排序效率。多路归并排序的基本思想是将待排序数组分成多个子数组,然后将这些子数组合并成一个有序的数组。多路归并排序可以使用堆来实现,从而提高排序效率。

  4. 原地归并排序(In-Place Merge Sort):原地归并排序是归并排序的一种变种,它可以在原地进行排序,即不需要额外的空间来存储归并过程中的临时数组。原地归并排序的基本思想是将待排序数组分成多个子数组,然后将这些子数组合并成一个有序的数组。原地归并排序需要使用插入排序来对小数组进行排序,从而提高排序效率。

四、Java 实现

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

public class MergeSort {
    public static void mergeSort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = left, j = mid + 1, 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 = {5, 2, 8, 3, 6, 1, 7, 9, 4};
        mergeSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

在上述代码中,mergeSort 方法实现了归并排序的递归调用,merge 方法实现了归并排序的合并过程。在 main 方法中,我们可以调用 mergeSort 方法对数组进行排序。

五、归并排序的应用场景

归并排序适用于以下场景:

  1. 大规模数据的排序:归并排序的时间复杂度为 O(nlogn),其中 n 表示待排序数组的长度。因此,归并排序适用于大规模数据的排序。

  2. 外部排序:归并排序可以对外部存储器中的大规模数据进行排序,因为归并排序可以将待排序数据分成多个子数组,分别进行排序,最后将排序好的子数组合并成一个有序的数组。

  3. 链表排序:归并排序适用于链表数据结构的排序,因为链表数据结构不支持随机访问,而归并排序可以在链表数据结构中进行排序。

  4. 稳定排序:归并排序是一种稳定的排序算法,即相等元素的相对位置在排序前后不会发生改变。因此,如果需要保持相等元素的相对位置不变,可以使用归并排序进行排序。

六、归并排序在spring 中的应用

在 Spring 中,归并排序并不是一个常用的算法,因此在 Spring 框架中并没有直接使用归并排序的场景。但是,在 Spring 框架中有很多需要排序的场景,例如对 Bean 的属性进行排序、对集合进行排序等。在这些场景下,Spring 通常会使用 Java 中的排序方法,例如 Arrays.sort() 或 Collections.sort() 方法,这些方法都是使用快速排序或归并排序等高效的排序算法进行排序的。因此,可以说归并排序在 Spring 中的应用是间接的,通过 Java 中的排序方法进行应用的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

要做存储业务,我解析了一个项目的源码

最近在做存储相关的业务&#xff0c;更具体的来说是存储相关的研发&#xff0c;于是就上网查了一下相关的资料&#xff0c;思虑再三打算从最简单的 Json 数据交换格式开始研究。 JSON是独立于编程语言的数据交换格式&#xff0c;几乎所有与网络开发相关的语言都有JSON函数库&am…

基于Java+SpringMvc+vue+element实现高效学生社团平台管理

基于JavaSpringMvcvueelement实现高效学生社团平台管理 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

oracle数据库当中用户的创建,添加,授权,以及表的创建与表的简单介绍,以及在oracle数据库当中的约束以及约束条件的简单介绍

系列文章目录 (3条消息) oracle数据库简介 文章目录 系列文章目录 前言 一、用户的创建 1.1、创建命令 1.2、给予scott用户权限 1.3、以scott用户进行连接登录 二、表和表的设计原则 2.1、表的概念 2.1.1、表是从属于用户的 2.1.2、表是逻辑表(概念表)&#xff0c;不…

gpt.4.0-gpt 国内版

gpt 使用 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种预训练的语言模型&#xff0c;可用于多种自然语言处理任务&#xff0c;如情感分析、文本分类、文本生成等。下面是使用GPT的一些步骤和建议&#xff1a; 确定任务和数据集&#xff1a;首先&…

Hibernate 快速入门

Hibernate 快速入门 〇、前言一、搭建 Hibernate 项目步骤1:新建 Java 项目附录1:新建Java项目中的相关文件信息步骤2:添加 Hibernate 框架支持附录2:添加Hibernate框架支持后,Java项目中的相关文件信息步骤3:其他关键配置1、添加数据库驱动包(本文以MySQL为例)2、配置…

C++11 列表初始化initializer_list

引子 C11&#xff0c;是继C98后的一次有力更新&#xff0c;引进了很多好用的语法&#xff0c;STL也添加了几个新容器&#xff0c;也解决了很多的问题。本篇博客就学习一下C11列表初始化的新语法和 initializer_list 文章目录 引子一. 列表初始化二. initializer_list结束语 一…

计算机底层知识

汇编语言&#xff08;机器语言&#xff09;的执行过程 汇编语言的本质&#xff1a;机器语言的助记符 其实他就是机器语言 计算机通电->CPU读取内存中程序&#xff08;电信号输入&#xff09; ->时钟发生器不断震荡通电 ->推动CPU内部一步一步执行&#xff08;执行多…

安卓开发 | 将Vue项目打包为app

知识目录 一、写在前面✨二、Hbuilder X准备&#x1f495;2.1 Hbuilder X简介2.2 下载 三、打包&#x1f495;3.1 获取dist目录3.2 新建5app3.3 替换文件3.4 编写manifast.json文件3.5 app云打包 四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xf…

OJ练习第107题——二叉搜索子树的最大键值和

二叉搜索子树的最大键值和 力扣链接&#xff1a;1373. 二叉搜索子树的最大键值和 题目描述 给你一棵以 root 为根的 二叉树 &#xff0c;请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下&#xff1a; 任意节点的左子树中的键值都 小于 此节点的键值。 任意…

龙蜥白皮书精选:利用 io_uring 提升数据库系统性能

文/高性能存储 SIG 01 背景介绍 传统的 IO 软件栈已经无法完全释放出高性能存储设备的性能&#xff0c;高性能 IO 栈是当前存储领域重点研究的课题之一&#xff0c;代表性的如用户态方案 SPDK&#xff0c;以及标准的内核态方案 io_uring。 02 关键技术 Linux 社区从零开始设…

SeaweedFs使用-通过http接口实现文件操作

通过http接口实现文件操作 SeaweedFs可通过filer的http接口/master中的http接口来进行文件上传 1.通过master的接口进行上传文件 通过各种方式进行请求接口&#xff1a;http://localhost:9333/submit, ip和端口号是master服务的信息。此接口通过post请求方式将文件的二进制流…

esp32CAM环境安装教程---串口驱动安装

前言 &#xff08;1&#xff09;本人安装好arduino 的ESP32环境之后&#xff0c; 发现一直下载不进去程序。一直说Cannot configure port, something went wrong. Original message: PermissionError。 &#xff08;2&#xff09;查阅了很多资料&#xff0c;用了各种办法&#…

自动生成测试用例_接口测试用例自动生成工具

前言 写用例之前&#xff0c;我们应该熟悉API的详细信息。建议使用抓包工具Charles或AnyProxy进行抓包。 har2case 我们先来了解一下另一个项目har2case 他的工作原理就是将当前主流的抓包工具和浏览器都支持将抓取得到的数据包导出为标准通用的 HAR 格式&#xff08;HTTP A…

图片模块封装:Glide高级使用+使用设计模式图片框架封装+Bitmap尺寸压缩和质量压缩+Bitmap加载大图长图

图片模块封装&#xff1a;Glide高级使用使用设计模式图片封装Bitmap尺寸压缩和质量压缩Bitmap加载大图长图 一.如何更换图片框架二.策略模式构建者模式图片框架搭建1.ImageOptions图片参数设置2.IImageLoader接口以及实现子类3.图片加载策略4.ImageLoaderManager6.业务模块中使…

tcp/ip

这里写自定义目录标题 线程 防止阻塞 123 windows下4 https://zhuanlan.zhihu.com/p/139454200 https://www.bilibili.com/video/BV1eg411G7pW/?spm_id_from333.337.search-card.all.click&vd_sourcee7d12c9f66ab8294c87125a95510dac9 with socket.socket() as s:s.bind(…

小航编程题库2022年NOC决赛图形化(小高组)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:A 第1题运行下面的程序&#xff0c;最终“我的变量”的值是多少&#xff1f; A、5B、10C、25D、30 答案…

计及N-k安全约束的含光热电站电力系统优化调度模型【IEEE14节点、118节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

南京邮电大学算法与设计实验三:动态规划法(最全最新,与题目要求一致)

实验原理&#xff1a; 1、用动态规划法和备忘录方法实现求两序列的最长公共子序列问题。要求掌握动态规划法思想在实际中的应用&#xff0c;分析最长公共子序列的问题特征&#xff0c;选择算法策略并设计具体算法&#xff0c;编程实现两输入序列的比较&#xff0c;并输出它们的…

编译原理之词法分析实验(附完整C/C++代码与总结)

一、实验内容 通过完成词法分析程序&#xff0c;了解词法分析的过程。编制一个读单词程序&#xff0c;对PL/0语言进行词法分析&#xff0c;把输入的字符串形式的源程序分割成一个个单词符号&#xff0c;即基本保留字、标识符、常数、运算符、分界符五大类。 对PL/0语言进行词法…

【野火启明_瑞萨RA6M5】按键输入检测

文章目录 一、GPIO输入——按键输入检测二、硬件设计三、软件设计下载验证 一、GPIO输入——按键输入检测 按键检测原理 按键机械触点断开、闭合时&#xff0c;由于触点的弹性作用&#xff0c;按键开关不会马上稳定接通或一下子断开&#xff0c;使用按键时会产生 下图中的带波…