图解Java中归并排序算法的原理与实现

图解Java中归并排序算法的原理与实现

什么是归并排序

归并排序是一种经典的排序算法,它的基本思想是通过将待排序序列不停地划分成两个子序列,将每个子序列排序后再将其合并,直到最终合并为一个有序的序列。

归并排序的原理

划分过程

首先将待排序序列分为两个长度相等的子序列,然后对每个子序列进行排序。

合并过程

合并两个有序的子序列,生成一个有序的子序列。重复此过程,直到最终生成一个有序的完整序列。

归并排序的步骤

1. 划分序列

首先需要在待排序序列中找到一个中间位置,将序列分为左右两个子序列,然后递归地将左右两个子序列再进行划分操作。

2. 合并有序序列

将排序后的两个有序子序列合并为一个有序序列。

/**
 * 合并两个有序数组
 *
 * @param nums1 第一个有序数组
 * @param nums2 第二个有序数组
 * @return 合并后的有序数组
 */
public static int[] merge(int[] nums1, int[] nums2) {
    int[] result = new int[nums1.length + nums2.length];
    int i = 0, j = 0, k = 0;
    while (i < nums1.length && j < nums2.length) {
        if (nums1[i] <= nums2[j]) {
            result[k++] = nums1[i++];
        } else {
            result[k++] = nums2[j++];
        }
    }
    while (i < nums1.length) {
        result[k++] = nums1[i++];
    }
    while (j < nums2.length) {
        result[k++] = nums2[j++];
    }
    return result;
}

3. 递归合并

循环将两个子序列进行合并操作,合并后得到一个更大的有序序列,递归执行直到最终得到一个有序的完整序列。

/**
 * 归并排序算法
 *
 * @param nums 待排序数组
 * @return 排序后的数组
 */
public static int[] mergeSort(int[] nums) {
    if (nums.length <= 1) {
        return nums;
    }
    int mid = nums.length / 2;
    int[] left = Arrays.copyOfRange(nums, 0, mid);
    int[] right = Arrays.copyOfRange(nums, mid, nums.length);
    return merge(mergeSort(left), mergeSort(right));
}

示例说明

示例一:对 5, 2, 3, 1, 8, 4 进行归并排序

  1. 初始状态:5, 2, 3, 1, 8, 4
  2. 划分序列:5, 2, 3, 1, 8, 4
    / \
    5, 2, 3 1, 8, 4
    / \ / \
    5 2, 3 1, 8 4
    / \ / \
    2 3 1 8
  3. 对每个子序列进行排序,得到两个有序子序列:
    左子序列:2, 3, 5
    右子序列:1, 4, 8
  4. 合并左右两个有序子序列,得到完整排好序的序列:1, 2, 3, 4, 5, 8

示例二:对 9, 8, 7, 6, 5 进行归并排序

  1. 初始状态:9, 8, 7, 6, 5
  2. 划分序列:9, 8, 7, 6, 5
    / \
    9, 8, 7 6, 5
    / \ / \
    9, 8 7 6 5
    / \ / \ / \ / \
    9 8 7 0 6 5 0 0
  3. 对每个子序列进行排序,得到两个有序子序列:
    左子序列:8, 9
    右子序列:5, 6
  4. 合并左右两个有序子序列,得到完整排好序的序列:5, 6, 8, 9, 7

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图解Java中归并排序算法的原理与实现 - Python技术站

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

相关文章

  • Python 数据结构之十大经典排序算法一文通关

    Python 数据结构之十大经典排序算法一文通关 一、前置知识 在学习本文之前,需要具备以下基础知识: Python 基础语法 算法与数据结构基础 二、十大经典排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 本文将一一讲解这十种排序算法。 三、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历过要排…

    算法与数据结构 2023年5月19日
    00
  • C++实现冒泡排序(BubbleSort)

    C++实现冒泡排序(BubbleSort)攻略 冒泡排序是一种简单的排序算法,它会重复地比较相邻的两个元素,如果顺序错误就交换它们的位置,直到排序完成。下面是C++实现冒泡排序的步骤。 1. 理解冒泡排序的基本原理 冒泡排序的基本思路是将待排序的数组分为已排序的部分和未排序的部分,先从未排序的部分开始,进行比较相邻元素的大小,并交换位置,直到本轮最大的元素被…

    算法与数据结构 2023年5月19日
    00
  • JS实现随机化快速排序的实例代码

    下面是JS实现随机化快速排序的完整攻略。 什么是随机化快速排序 随机化快速排序是一个常用的排序算法,它能够在 $O(n \log n)$ 的时间复杂度下对一个数组进行排序。该算法的实现非常高效,因为它使用了分治的思想,并且使用的是原地排序,即不需要额外的存储空间。随机化快速排序的核心是分区(partition)操作,该操作能够将一个数组分成两个部分,一部分是…

    算法与数据结构 2023年5月19日
    00
  • Java语言字典序排序算法解析及代码示例

    Java语言字典序排序算法解析及代码示例 概述 字典序排序是一种常见的字符串排序算法,其可用于字符串编程中的许多场景,例如:搜索引擎中输入提示的联想;电商网站的商品搜索结果排列;信息化项目中的数据对比等。 本文将介绍Java语言中使用字典序排序的方法以及实现代码,并包含两个代码示例以帮助读者更好地理解。 基本思想 字典序排序的基本思想是将需要排序的字符串按照…

    算法与数据结构 2023年5月19日
    00
  • java排序算法图文详解

    Java排序算法图文详解 在Java编程中,排序算法是非常重要且常见的一部分。本文将详细讲解Java中的各种排序算法及其实现,帮助读者了解不同算法的特点和使用场景,提高程序的效率和可读性。 排序算法分类 在Java中,常用的排序算法主要可以分为以下几类: 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 冒泡排序 冒泡排序是一种简单的排序算法,其原理…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法系列之桶排序详解

    PHP排序算法系列之桶排序详解 什么是桶排序? 桶排序是一种简单的排序算法,通过将待排序数组元素分别放到对应的桶中,然后在桶中对元素进行排序,最后将所有桶中元素合并得到有序的数组。 桶排序的步骤 创建一个数组作为桶,数组大小为待排序数组中的最大值加1,数组中每个元素初始化为0。 遍历待排序数组,将每个元素放到对应的桶中,即桶数组中下标为待排序元素的值的元素加…

    算法与数据结构 2023年5月19日
    00
  • 深入解析桶排序算法及Node.js上JavaScript的代码实现

    深入解析桶排序算法及Node.js上JavaScript的代码实现 桶排序算法介绍 桶排序算法是一种非常有效的排序方法,通常用于在已知数据范围的情况下对数据进行排序。桶排序将数据分配到一个或多个桶中,然后对每个桶中的数据进行排序,最后将所有桶中的数据依次合并即可得到有序的结果。 桶排序的时间复杂度为O(n),其中n为待排序的数据个数。如果数据范围较大,需要分…

    算法与数据结构 2023年5月19日
    00
  • 华为笔试算法题汇总

    下面是“华为笔试算法题汇总”的完整攻略: 一、题目来源 本篇攻略总结了华为笔试中常见的算法题目,这些题目可以在华为科技招聘官网上的笔试环节中出现。 二、题目类型 华为笔试中常见的算法题目主要包括: 字符串操作:如字符串反转、字符串查找等; 数组排序:如快排、归并排序等; 链表操作:如链表反转、链表合并等; 动态规划问题:如背包问题、最长公共子序列等; 图论问…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部