排序算法之——合并排序/归并排序(Java实现)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
今天,来讲一讲合并排序,其实我已经写了  堆排序 和  快速排序,本来都不想写这个,但是,当我发现我身边很多人竟然都不知道这个排序的时候,我震惊了,毕竟,这是一个经典的入门算法(反正外国貌似是这样的,根据我看的书和视频),历史也十分悠久。下面就来讲讲这历史悠久的算法。

        合并排序是一种典型的分治法算法。先把数组拆成两个数组,对两个数组进行继续拆分,直到能够对拆分后的两个结果分别进行排序。也就是说,拆分后,使两边都是排好序的。显然当拆分到两边只剩下一个的时候,自然就是有序的。

        拆分过后是合并,合并也是这个算法的核心过程,其实就好比是两副牌,这两副牌已经是有序的,要把它们合并,只要每次都翻开最上面一张牌,然后进行对比,把小的(或此处按照递增排序举例)拿走。然后继续翻牌。很显然,这里会用到额外的数组空间,所以合并排序并不是原地排序。为了简化这个过程,合并的时候,在两副牌下面都放置一个无穷大的哨兵牌。具体过程如下图所示。


本图选自算法导论。实现代码如下:

/**
     * 合并排序,一个数字的时候算已排序,最后合并排序过的数组
     * @param A 目标数组
     * @param p 左标记位
     * @param r 右标记位
     */
    public void MergeSort(int[] A, int p, int r) {
        if (p < r) {
            int q = (p + r) / 2;
            MergeSort(A, p, q);
            MergeSort(A, q + 1, r);
            Merge(A, p, q, r);
        }
    }

核心方法如下:

/**
     * 合并排序过的数组,把数组分成了[p --> q],[q+1 --> r]
     * @param A 目标数组
     * @param p 左标记位
     * @param q 中标记位
     * @param r 左标记位
     * @return 结果数组
     */
    public int[] Merge(int[] A, int p, int q, int r) {
        int n1 = q - p + 1;
        int n2 = r - q;
        int[] L = new int[n1 + 1];
        int[] R = new int[n2 + 1];
//        for (int i = 0; i < n1; i++) {
//            L[i] = A[p + i];
//        }
        System.arraycopy(A, p, L, 0, n1);
//        for (int i = 0; i < n2; i++) {
//            R[i] = A[q + i + 1];
//        }
        System.arraycopy(A, q+1, R, 0, n2);
        L[n1] = Integer.MAX_VALUE;
        R[n2] = Integer.MAX_VALUE;
        int i = 0, j = 0;
        for (int k = p; k <= r; k++){
            if (L[i] <= R[j]) {
                A[k] = L[i];
                i++;
            } else {
                A[k] = R[i];
                j++;
            }
        }
        return A;
    }
Java System.arraycopy方法的使用


上面有所有方法的单元测试:https://github.com/qjkobe/IntroductionToAlgorithms


如果有啥问题记得跟我说哈


原文:http://blog.csdn.net/qj30212/article/details/52495008

我略微修改了一下代码和描述

java归并排序详解_排序算法之——合并排序/归并排序Java实现 今天,来讲一讲合并排序,其实我已经写了 堆排序 和 快速排序,本来都不想写这个,但是,当我发现我身边很多人竟然都不知道这个排序的时候,我震惊了,毕竟,这是一个经典的入门算法(反正外国貌似是这样的,根据我看的书和视频),历史也十分悠久。下面就来讲讲这历史悠久的算法。合并排序是一种典型的分治法算法。先把数组拆成两个数组,对两个数组进行继续拆分,直到能够对拆分后的两个结果分别进行排序。也就是说,拆分后,... 阅读详情

相关推荐

排序算法归并排序原理及Java实现

归并排序就是利用归并的思想实现排序方法。而且充分利用了完全二叉树的深度特性,因此效率比较高。其基本原理如下:对于给定的一组记录,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序,最后再用递归方法将排好序的半子表合并成为越来越大的有序序列。 经过第一轮比较后得到最小的记录,然后将该记录的位置与第一个记录的位置交换;接着对不包括第一个记录以外的其他记录进行第二次

简约人生的博客 5万+

基础算法之合并排序Java实现

package com.gary.合并排序; /** * 合并排序算法是用分治策略实现对N个元素进行排序的算法。其基本思想是:&lt;br&gt; * 将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。&lt;br&gt; * 主要思想:1.分治 : 将N个元素集合二分直到不能分为止&lt;br&gt; *       ...

gary0917的博客 340

归并(合并排序算法Java实现

归并排序算法的思想,实现步骤,二路归并算法步骤,二路归并排序算法代码实现Java

Lyhdreamer的博客 3385

合并排序归并排序

合并排序,大致思想便是先将数组中的元素拆分成若干小部分,然后再将这些小部分按照顺序进行重新组合,从而实现排序。很明显,这里用到了分治法的思想,即将一个大问题分成若干个相同的小问题,因为问题规模变小了,所以解决问题的难度也随之减小,试想一下,对一个拥有10000个元素的数组进行排序简单还是对一个只拥有1个元素的数组进行排序简单?答案很明显。 对于合并排序,将大问题分成若干小问题是一件很容易的事情,只需要不断递归即可,其中最主要的难点就是将这些小问题解决之后,如何再将这些小问题合并起来,若是处理不好,很可能就导

学习永无止境 1万+

归并排序算法 C代码实现

合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路

yinyuzw的专栏 1040

归并排序

归并排序 public class MergeSort { public static void main(String[] args) { int i = 0; int a[] = { 5, 4, 9, 7, 8, 0, 6, 1, 3, 2 }; int len = a.length; MergeSort(a, 0, len - 1); for (Integer x

Shangri-La 999

9种排序算法---合并排序算法

归并排序是一种高效的排序算法,适用于大数据集。它的时间复杂度为O(n log n),其中n是数组的长度。归并排序是稳定的排序算法,即相等的元素在排序后保持它们原来的顺序。

2301_78576595的博客 870

Java排序()归并排序

归并排序 递归的把已有序列均分为两个子序列,使子序列有序,合并子序列 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 Java实现归并排序 public class MergeSort { private static int[] aux;//归并所需的辅助数组 public static v...

LrvingTc的博客 321

归并排序是一种分治法的典型应用,它的基本思想是将待排序的数组或链表递归划分成若干个子序列

归并排序是一种分治法的典型应用,它的基本思想是将待排序的数组或链表递归划分成若干个子序列,接着将子序列归并为较大的有序序列。稳定算法是指,在排序的过程中,相等元素的相对顺序不发生改变。总之,归并排序是一种高效的排序算法,其基本原理是将待排序的序列拆分为两个子序列,合并两个有序子序列,最终合并为一个有序序列。在归并排序中,由于是对原数组进行拆分、排序合并的操作,当要合并两个有序数组时,如果两个数组中有相等的元素,将先将左边数组中的元素放入结果数组中,这也就是归并排序的保序性。本章介绍排序算法中的归并排序

[Blog][Domain] programb.blog.csdn.net 256

排序算法归并排序

归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

9259

java实现归并排序算法

java实现归并排序 一. 归并排序的思路 归并排序通过不断的将原数组进行拆分(通常拆分成左右两项),一直到剩下一项,然后分别将拆分的子数组进行合并,此时,两个子数组已经是排好序的,所以合并排序只需要进行一趟排序即可完成,所以此类排序需要两个步骤:1.拆分原数组 2.合并子数组。因此此算法是经典的分治算法。 拆分算法的思路 利用递归,不断得寻找左子数组和右子数组,一直到数组的长度为一 合并算法的...

Mark的博客 1万+

排序算法归并排序(JAVA)

public class MergeSort { /** * 归并排序 * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 * 时间复杂度为O(nlogn) * 稳定排序方式 * @param nums 待排序数组 * @return 输出有序数组 */ public s

heitdf 5万+

Java排序算法(5):归并排序

归并排序(Merge Sort)是一种基于分治思想的排序算法。它将待排序的数组分成两个长度相等的子数组,然后对这两个子数组分别进行归并排序,最后将两个排好序的子数组合并成一个有序的数组。

暗星涌动 3609

java实现排序算法归并排序(2路归并)

java实现归并排序讲解

NFMSR的博客 3529

归并排序Java代码实现

归并排序Java代码实现 1. 算法思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 2. 时间复杂度 最好时间复杂度很最坏时间复杂度都是O ( n log2 n ) 3. 代码实现 public class Mergee { public static void main(String[] args) {

m0_48372408的博客 2313

Java排序算法之<归并排序

归并排序是一种采用分治法的高效排序算法。其时间复杂度为O(nlogn),空间复杂度为O(n),具有稳定性。算法通过递归地将序列二分至单个元素,再两两合并有序子序列完成排序。具体实现包括:申请同等大小的临时数组、递归分组、比较合并等步骤。文中提供了完整的Java代码示例,展示了序列[28,19,8...9]的完整排序过程,最终输出有序结果[8,9,10...28]。该算法适合处理大规模数据,但需要额外存储空间。

weixin_50055999的博客 1356

【十大排序算法】(七)归并排序算法

一、基本思想 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 二、算法分析 1、算法描述 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排...

riemann_的博客 1820

Java 实现归并排序:深入剖析原理与代码

合并过程中,将两个已经排序好的子数组(通常是相邻的)合并成一个更大的排序好的子数组。具体操作是比较两个子数组的首元素,将较小的元素取出放入一个临时数组中,然后继续比较两个子数组的下一个元素,直到其中一个子数组的元素全部被放入临时数组。最后,将临时数组中的元素复制回原数组对应的位置,完成一次合并操作。在这篇博客中,我们将详细解析一段用 Java 实现归并排序代码,帮助大家深入理解归并排序的原理以及具体的实现细节。方法负责将两个已经拆分并可能已经排序好的子数组进行合并,使其成为一个更大的排序好的子数组。

qq_69304031的博客 1040
上一篇: Java System.arraycopy方法的使用
下一篇: 堆排序Heap Sort——浅显易懂+Java实现
sunnylinner
博客等级 码龄12年 42粉丝 65原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值