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

news/2024/5/17 20:01:33 标签: 排序算法, java, 算法, 归并排序

一、归并排序

归并排序(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 实现归并排序的示例代码:

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 中的排序方法进行应用的。


http://www.niftyadmin.cn/n/352650.html

相关文章

简单的Kubernetes(简称 K8s)安装教程

Kubernetes&#xff08;简称 K8s&#xff09;是一种自动化容器操作的开源平台。它使得部署、扩展和管理容器化应用程序变得简单。本篇文章旨在提供一个详细的 Kubernetes 安装指南&#xff0c;同时介绍网络配置和确保 Pod 生命周期的方法。 部署 Kubernetes 集群需要至少两台机…

Allure在本地不安装allure服务的情况下打开Allure Html报告

前言 我们使用pytestallure生成Allure测试报告后&#xff0c;需要发给领导查看报告的详细信息。此时我们通过将allure生成的html报告压缩成压缩包后发送给领导&#xff0c;但是领导电脑由于没有安装Allure服务&#xff0c;打开会全部显示“Loading”&#xff0c; 无法查看到报…

5.4 标准I/O(四)

标准I/O-按对象读写 下列函数用来从流中读写若干个对象: #include <stdio.h> size_t fread(void *ptr, size_t size, size_t n, FILE *fp); size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp); 成功返回读写的对象个数&#xff1b;出错时返回EOF 既…

奇安信2023HVV面试笔记

登陆注册框页面可以测试哪些漏洞 初级面试参考题sql写shell sqlmap risk levels区别 如何加固主机 报错注入函数 支持报错注入的数据库 国誉2022初级护网面试给你一个登录框&#xff0c;如何测 csrf产生的原因是什么&#xff0c;简单一句话 sql注入类型 中挖矿如何排查解决 如何…

spark的内存管理

spark中shuffle的写入磁盘的数量 R为reduce的数量 M为maptask的数量 core 为executor cpu的数量 shuffle中落盘的数量 MR coreR 2M SparkEnv val memoryManager: MemoryManager UnifiedMemoryManager(conf, numUsableCores) --统一内存管理&#xff0c;&#xff08;动态内存…

3000+AI 工具大合集!分享一个最全 AI 工具导航,就是它了!

“我们最开始以为&#xff08;人工智能&#xff09;是互联网十年不遇的机会&#xff0c;但是越想越觉得&#xff0c;这是几百年不遇的、类似发明电的工业革命一样的机遇。”——腾讯 马化腾 “大家不要把它看成一个新时代的搜索或者是新的聊天机器人&#xff0c;这只是它第一个…

Win11的两个实用技巧系列之磁盘清理找回方法、pin码忘了无法开机的解决方法

Win11磁盘清理怎么变成详细信息了?Win11磁盘清理找回方法 有用户早前将自己的电脑系统升级到了Win11系统来使用&#xff0c;想要去将系统磁盘进行垃圾清理&#xff0c;但是却发现磁盘清理怎么变成详细信息了&#xff0c;本文就为大家带来了详细的解决方法&#xff0c;需要的朋…

CentOS7 磁盘扩容

当 CentOS 7 操作系统中的磁盘空间不足时&#xff0c;需要对磁盘进行扩容以增加存储空间&#xff0c;这篇文章将向您介绍如何扩展 CentOS 7 磁盘空间。 在扩展磁盘空间之前&#xff0c;您需要先准备好以下几个条件&#xff1a; 系统硬件配置支持磁盘扩容。已经在系统中安装了…