JAVA十大排序算法之归并排序详解

JAVA十大排序算法之归并排序详解

一、概述

归并排序是一种高效稳定的排序算法,它将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将有序的子序列合并成整体有序的序列。由于归并排序是基于比较的排序算法,因此时间复杂度为 O(nlogn)。

二、算法流程

归并排序算法分为两个过程:分治和合并。

  1. 分治:将待排序的序列平分成两个子序列,对左右两个子序列分别进行递归排序。当子序列长度小于等于1时,停止递归。

  2. 合并:将排好序的左右子序列合并成一个有序的序列。

三、JAVA代码实现

public static void mergeSort(int[] arr, int low, int high) {
    if (low < high) {
        int mid = (low + high) / 2;
        // 递归分治
        mergeSort(arr, low, mid);
        mergeSort(arr, mid + 1, high);
        // 合并子序列
        merge(arr, low, mid, high);
    }
}

private static void merge(int[] arr, int low, int mid, int high) {
    int[] temp = new int[high - low + 1];
    int i = low;
    int j = mid + 1;
    int k = 0;
    // 比较左右子序列,合并成一个有序的序列
    while (i <= mid && j <= high) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= high) {
        temp[k++] = arr[j++];
    }
    // 将临时数组中的元素复制到原数组中
    for (int m = 0; m < temp.length; m++) {
        arr[low + m] = temp[m];
    }
}

在上面的代码中,mergeSort() 方法是归并排序的入口方法,merge() 方法是合并两个子序列的方法。

四、示例说明

示例一

对于待排序序列 [5, 3, 6, 8, 4, 2],按照归并排序的流程,分别进行以下操作:

  1. 分治:将待排序的序列分成 [5, 3, 6][8, 4, 2] 两个子序列,对子序列进行递归排序。

    • [5, 3, 6] :将子序列分成 [5, 3][6] 两个子序列,对子序列进行递归排序。

      • [5, 3] :将子序列分成 [5][3] 两个子序列,对子序列进行递归排序。

        • [5][3] 都只有一个元素,递归终止。
      • [6] :只有一个元素,递归终止。

    • [8, 4, 2] :将子序列分成 [8][4, 2] 两个子序列,对子序列进行递归排序。

      • [4, 2] :将子序列分成 [4][2] 两个子序列,对子序列进行递归排序。

        • [4][2] 都只有一个元素,递归终止。
      • [8] :只有一个元素,递归终止。

  2. 合并:将排好序的子序列合并成有序的序列。首先将 [5][3] 合并成 [3, 5],然后将 [6][3, 5] 合并成 [3, 5, 6]。将 [4][2] 合并成 [2, 4],然后将 [8][2, 4] 合并成 [2, 4, 8]。最后将 [3, 5, 6][2, 4, 8] 合并成 [2, 3, 4, 5, 6, 8]。完成排序。

示例二

对于待排序序列 [7, 4, 3, 8, 1, 5],按照归并排序的流程,分别进行以下操作:

  1. 分治:将待排序的序列分成 [7, 4, 3][8, 1, 5] 两个子序列,对子序列进行递归排序。

    • [7, 4, 3] :将子序列分成 [7][4, 3] 两个子序列,对子序列进行递归排序。

      • [4, 3] :将子序列分成 [4][3] 两个子序列,对子序列进行递归排序。

        • [4][3] 都只有一个元素,递归终止。
      • [7] :只有一个元素,递归终止。

    • [8, 1, 5] :将子序列分成 [8][1, 5] 两个子序列,对子序列进行递归排序。

      • [1, 5] :将子序列分成 [1][5] 两个子序列,对子序列进行递归排序。

        • [1][5] 都只有一个元素,递归终止。
      • [8] :只有一个元素,递归终止。

  2. 合并:将排好序的子序列合并成有序的序列。首先将 [4, 3][7] 合并成 [3, 4, 7],然后将 [1][5] 合并成 [1, 5],最后将 [3, 4, 7][1, 5, 8] 合并成 [1, 3, 4, 5, 7, 8]。完成排序。

五、总结

归并排序是一种高效稳定的排序算法,时间复杂度为 O(nlogn),比较适合对大规模数据的排序。在实际应用中,由于归并排序需要合并两个有序的子序列,所以需要额外的存储空间来存储这些子序列。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA十大排序算法之归并排序详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java实现的连接数据库及模糊查询功能示例

    以下是详细的攻略: 连接数据库 Java连接数据库需要使用JDBC(Java Database Connectivity)技术,具体过程如下: 导入JDBC驱动程序。如果使用MySQL数据库,则需要下载相应的驱动。可以在MySQL官网 下载最新版本的JDBC驱动。 加载驱动程序。可以使用Class.forName()方法来加载驱动程序。 建立数据库连接。使用…

    Java 2023年5月19日
    00
  • 详解Java-Jackson使用

    详解Java-Jackson使用 简介 Jackson是一个流行的Java库,用于序列化和反序列化Java对象和JSON数据。它提供了快速,灵活,易于使用的API。 本文将详细讲解在Java项目中如何使用Jackson进行序列化和反序列化,包括几个常用的场景和示例。 添加依赖 要使用Jackson,在Java项目中需要添加Jackson的依赖。可以通过在Ma…

    Java 2023年5月19日
    00
  • 如何选择合适的Java垃圾收集器?

    首先,我们需要了解几种Java垃圾收集器的工作原理和特点,以作为选择的依据。通常我们会考虑以下几个方面: 垃圾回收机制:垃圾回收的机制是选择垃圾收集器的一个关键考虑因素。 内存模型:垃圾收集器通常会根据内存模型的特点来选择合适的算法。 吞吐量和延迟:吞吐量和延迟是垃圾收集器选择的主要考虑因素。 碎片整理能力:这是垃圾收集器的一个关键特点。碎片整理能力越强,程…

    Java 2023年5月11日
    00
  • Spring Security短信验证码实现详解

    Spring Security短信验证码实现详解 简介 Spring Security是一个功能强大的认证和授权框架。它提供了多种认证方案,包括用户名密码认证、OAuth2.0认证等。但是默认情况下,Spring Security没有提供短信验证码认证的实现。因此,如果我们需要在Spring Security中实现短信验证码认证,需要自己进行实现。 本文将详…

    Java 2023年6月3日
    00
  • 利用Spring AOP记录方法的执行时间

    利用Spring AOP记录方法的执行时间可以通过以下步骤实现: 1. 添加依赖 在pom.xml文件中添加Spring AOP的依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</arti…

    Java 2023年5月20日
    00
  • 教你使用springSecurity+jwt实现互踢功能

    我会从以下几个方面讲解如何使用Spring Security和JWT实现互踢功能: Spring Security和JWT简介 实现互踢功能的思路 配置Spring Security和JWT 实现互踢功能的示例 防止并发登录 防止token重复使用 Spring Security和JWT简介 Spring Security是基于Spring框架的安全框架,提…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“ConversionException”的原因与解决方法

    当使用Java的Apache Commons类库时,可能会遇到“ConfigurationException”错误。这个错误通常由以下原因之一起: 配置文件错误:如果配置文件错误,则可能会出现此错误。在这种情况下,需要检查配置文件以解决此问题。 配置项缺失:如果配置项缺失,则可能会出现此错误。在这种情况下,需要检查配置项以解决此问题。 以下是两个实例: 例1…

    Java 2023年5月5日
    00
  • Java编写Mapreduce程序过程浅析

    Java编写Mapreduce程序是一项重要的技能,能够帮助我们高效地处理大型数据集。以下是关于Java编写Mapreduce程序的完整攻略: 1. 准备开发环境 在Java编写Mapreduce程序之前,需要准备好以下开发环境: 开发工具:推荐使用IntelliJ IDEA或Eclipse等常见Java开发工具。 Hadoop环境:需要安装Hadoop环境…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部