图解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日

相关文章

  • PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解

    PHP是一门广泛应用于Web开发领域的脚本语言,而算法在计算机科学领域也是非常重要的一部分,掌握一些常用的算法能够为程序员的工作带来极大的便利。本文将详细讲解PHP冒泡排序、二分查找、顺序查找、二维数组排序算法函数的详解。 冒泡排序 冒泡排序是一种比较简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就将它们交换,直到没有任何一对…

    算法与数据结构 2023年5月19日
    00
  • 算法系列15天速成 第六天 五大经典查找【下】

    算法系列15天速成 第六天 五大经典查找【下】- 完整攻略 简介 本篇文章是算法系列15天速成中的第六天内容,主要是介绍五大经典查找的后三种查找算法:插值查找、斐波那契查找以及分块查找。在介绍每一种查找算法时都会包含具体的思路、复杂度和应用场景等内容。 插值查找 思路 插值查找是在二分查找的基础上优化的一种查找算法,它不是通过数组的中间元素进行查找,而是通过…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中几种排序算法的简单实现

    JavaScript中几种排序算法的简单实现 排序算法在计算机科学中是一个基本问题。不同的排序算法具有不同的时间和空间复杂度,选择合适的排序算法可以提高程序的效率。本文介绍了JavaScript中几种排序算法的简单实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。 冒泡排序 冒泡排序是最简单的排序算法之一。它重复遍历列表,比较相邻的元素,并交换它们…

    算法与数据结构 2023年5月19日
    00
  • 2020年新浪最新PHP试题和答案解析

    2020年新浪最新PHP试题和答案解析攻略 作为新浪最新的PHP试题,本门考试难度较高。以下是一些考试攻略以及答案解析。 试题分析 本次试题由多道选择题和编程题组成,主要考察PHP语言基础、框架使用、数据库操作等方面的知识。 选择题 本次选择题共15道,主要考察PHP基础语法、函数使用、面向对象编程、异常处理等方面的知识。 编程题 本次编程题共2道,主要考察…

    算法与数据结构 2023年5月19日
    00
  • javascript基本常用排序算法解析

    让我来为您详细讲解“JavaScript基本常用排序算法解析”的完整攻略。 一、前言 排序算法是计算机科学中最常用的算法之一。它可以将我们需要排序的数据快速进行排序,加速我们的代码算法运行速度。在本篇文章中,我们将给您介绍一些基本的、常用的排序算法。 二、常用排序算法 冒泡排序 冒泡排序是一种比较简单但实用的排序算法,也是最基本的排序算法之一。它的基本思想是…

    算法与数据结构 2023年5月19日
    00
  • C++选择排序算法实例详解

    C++选择排序算法实例详解 选择排序算法简介 选择排序是一种简单直观的排序算法,其思想是首先找到序列中的最小值,然后将其放到序列的最前面。接着,从剩余序列中找到次小值,将其放到已排序序列的末尾。以此类推,直到排序完成。 选择排序算法的时间复杂度为$O(n^2)$,空间复杂度为$O(1)$,并且由于其算法思想简单,代码实现容易,所以在实际应用中还是比较常见的排…

    算法与数据结构 2023年5月19日
    00
  • Java排序之冒泡排序的实现与优化

    Java排序之冒泡排序的实现与优化 冒泡排序基本原理 冒泡排序是一种简单的排序算法,其基本思想是通过比较相邻的元素,将较大的数交换到右边,较小的数交换到左边。这样每一轮交换后,未排序的数列中的最大元素就被移动到了最右边,因此被称为“冒泡排序”。 基本算法实现 下面是基本的冒泡排序算法实现: public static void bubbleSort(int[…

    算法与数据结构 2023年5月19日
    00
  • Go语言实现常用排序算法的示例代码

    本文将详细介绍如何使用Go语言实现常用排序算法的示例代码。主要内容包括: 排序算法介绍 排序算法示例代码 算法测试 排序算法介绍 排序算法是计算机科学基本的算法,其目的是将一组数据按照特定的规则进行排序。常用的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序等。以下是每种算法的简单介绍: 冒泡排序:重复比较相邻的两个元素,将较大的元素向后移动,最…

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