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),比较适合对大规模数据的排序。在实际应用中,由于归并排序需要合并两个有序的子序列,所以需要额外的存储空间来存储这些子序列。

阅读剩余 62%

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

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

相关文章

  • SpringBoot如何根据用户系统时区动态展示时间

    首先,在SpringBoot中获取当前用户的时区,一般采用以下方式: @RequestMapping("/getTime") public String getTime(HttpServletRequest request) { TimeZone timeZone = (TimeZone) request.getSession().get…

    Java 2023年5月20日
    00
  • Java毕业设计之多用户宿舍管理系统的实现

    Java毕业设计之多用户宿舍管理系统的实现攻略 1. 需求分析 多用户宿舍管理系统需要实现如下功能:1. 根据管理员账号和密码登录系统;2. 管理员可以添加、查询、修改和删除学生信息;3. 管理员可以添加、查询、修改和删除宿舍信息;4. 管理员可以将学生分配到某个宿舍;5. 学生可以使用学生账号和密码登录系统;6. 学生可以查询自己的宿舍信息,并进行相关操作…

    Java 2023年5月24日
    00
  • 关于java方法区详解

    Java方法区详解 在Java虚拟机中,方法区是一块被线程共享的内存区域,用于存储类、常量、静态变量、即时编译器编译后的代码等数据。本文将详细介绍Java方法区的相关知识。 方法区的作用 方法区主要用于存储类相关的数据,具体包括以下内容: 1.类信息:类的完全限定名、父类的完全限定名、实现接口的完全限定名、类的修饰符等。 2.常量池:用于存储编译期生成的各种…

    Java 2023年5月20日
    00
  • echarts整合多个类似option的方法实例

    下面我将为您详细讲解“echarts整合多个类似option的方法实例”的完整攻略,主要分为以下几步进行。 1. 确认需求 在开始实现之前,我们首先需要确认我们的需求是什么。假设我们需要实现一个折线图,我们希望可以通过选择不同的时间段,动态的显示不同的数据,例如按天、按周、按月等显示数据。 2. 构建数据 为了实现我们的需求,我们需要构建一个数据对象,来保存…

    Java 2023年6月15日
    00
  • 什么是Java多线程,如何实现

    什么是Java多线程? 多线程是指在一个程序中同时运行多个线程,并行执行多个任务的技术。Java是一种多线程编程语言,提供了丰富的多线程API,使得开发者可以轻松地创建多线程应用程序。 在Java中,每个线程都是一种独立的执行路径,每个线程都会独立地执行自己的代码和内存空间,并且可以互不干扰的访问其它线程中的数据。 如何实现Java多线程? Java提供了两…

    Java 2023年5月19日
    00
  • Java enum的用法详细介绍及实例代码

    Java中的枚举类型是一种特殊的类,它具有固定数量和固定名称的常量。枚举类型可以让代码更加清晰易懂,避免了使用数字或字符串表示常量时出现的错误。 声明枚举类型 在Java中,声明枚举类型需要使用关键字enum。下面是一个最简单的例子: enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, S…

    Java 2023年5月23日
    00
  • JavaSpringBoot报错“TypeMismatchException”的原因和处理方法

    原因 “TypeMismatchException” 错误通常是以下原因引起的: 参数类型不匹配:如果您的参数类型不匹配,则可能会出现此错误。在这种情况下,您需要检查您的参数类型并确保它们匹配。 参数格式不正确:如果您的参数格式不正确,则可能会出现此错误。在这种情况下,您需要检查您的参数格式并确保它们正确。 解决办法 以下是解决 “TypeMismatchE…

    Java 2023年5月4日
    00
  • Java 实战项目基于遗传算法学校排课系统的实现流程

    Java 实战项目基于遗传算法学校排课系统的实现流程 1. 介绍 本项目使用 Java 编程语言,基于遗传算法实现了学校排课系统。该系统可以自动根据学生、教师、教室等信息,生成课表并进行排课。 2. 系统设计 2.1 数据结构设计 根据本系统的需求,我们设计了以下数据结构: 课程表(schedule):记录所有的课程信息,包括课程名称、授课教师、授课班级、上…

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