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数组输出的实例代码”的完整攻略,包含以下内容: 数组的定义与初始化 数组元素的访问和输出 示例说明 数组的定义与初始化 在Java中,定义数组需要指定数组的类型和数组的大小,格式如下: 数据类型[] 数组名 = new 数据类型[数组大小]; 其中,数据类型可以为Java中的任意基本数据类型或引用类型,数组大小为正整数。 例如,…

    Java 2023年5月23日
    00
  • List集合多线程并发条件下不安全如何解决

    List集合在多线程并发条件下存在线程安全问题,主要是由于多个线程在同时对List进行增删改操作,会产生竞争条件。在此情况下,如果不进行处理,会导致List集合数据不一致或者抛出ConcurrentModificationException异常等问题。下面是解决List集合多线程并发不安全的完整攻略: 方案1:使用线程安全的List集合 Java提供了多个线…

    Java 2023年5月26日
    00
  • SpringMVC+ZTree实现树形菜单权限配置的方法

    下面是完整攻略: 1. 准备工作 1.1 搭建SpringMVC项目 首先我们需要搭建一个SpringMVC项目,这里不做过多介绍,建议使用Maven进行管理。 1.2 引入ZTree插件 在搭建完SpringMVC项目后,在项目中引入ZTree插件。可以使用CDN的方式,也可以下载到本地引入。 1.3 数据库设计 在实现权限配置时,需要通过数据库保存树形菜…

    Java 2023年6月16日
    00
  • SpringBoot实现统一封装返回前端结果集的示例代码

    下面我来详细讲解如何实现SpringBoot的统一封装返回前端结果集的示例代码的完整攻略。 1. 为什么需要统一封装返回结果集 在我们使用SpringBoot开发Web应用时,通常经常会用到Controller来处理请求。Controller的主要作用是接收请求,处理业务逻辑,然后将结果返回给前端。通常情况下,我们在Controller方法中使用如下方式处理…

    Java 2023年5月26日
    00
  • JAVA StringBuffer类与StringTokenizer类代码解析

    JAVA StringBuffer类与StringTokenizer类代码解析 StringBuffer类 StringBuffer类是java中的一个类,位于java.lang包中。该类用于提供可变的字符串,它的长度和内容可以随时改变。在字符串频繁变化的应用场景下,使用StringBuffer相较于直接操作String具有更好的性能表现。 StringBu…

    Java 2023年5月26日
    00
  • JavaScript Uploadify文件上传实例

    下面是JavaScript Uploadify文件上传实例的完整攻略,主要包括以下几个部分: 1. 环境搭建 在开始之前,需要将环境搭建好,确保能够正常运行。需要安装以下两个组件: jQuery库(版本>=1.7) Uploadify插件(版本>=3.2) 2. HTML结构 在HTML页面中,需要创建一个file input来选择需要上传的文件…

    Java 2023年6月15日
    00
  • jsp、css中引入外部资源相对路径问题分析

    让我结合标准的markdown格式来详细讲解一下“jsp、css中引入外部资源相对路径问题分析”的完整攻略。 问题背景 在jsp和css中,我们经常需要引入外部资源,例如图片、样式表、脚本文件等。这些资源的引入路径可能涉及到相对路径和绝对路径的问题,如果不理解路径的规则,就容易导致资源引入失败,或者出现页面样式混乱等问题。 相对路径 相对路径是指相对于当前文…

    Java 2023年6月15日
    00
  • Netty4之如何实现HTTP请求、响应

    Netty4 是一个开源的、事件驱动的、异步的、高性能的网络通信框架,支持多种协议通信。Netty4 同时支持 HTTP 和 HTTP/2 协议,本文将介绍如何在 Netty4 中实现 HTTP 请求和响应的过程和示例。 简介 Netty4 实现 HTTP 请求、响应的过程主要分为以下几个步骤: 创建 HTTP Server。 绑定端口启动 HTTP Ser…

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