归并排序

归并排序与原地归并排序 归并排序的思想:假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2-路归并排序。其核心操作是将一个一维数组的前后相邻的两个子序列合并为一个有序序列。下图为一个2路归并排序的例子。 阅读详情

归并排序

分解:分解待排序的n个元素为各具n/2个元素的子序列
解决:使用归并排序递归地排序两个子序列
合并:合并两个已排序的子序列产生已排序的答案

介绍

复杂度:T(n) = cnlgn + cn

关键点:归并排序算法的关键是"合并"步骤中两个已排序序列的合并。我们调用MERGE(A, p, q, r)来完成合并,其中A是一个数组,p、q和r是数组下标,满足p<=q<r。该过程假设子数组A[p…q]和[q + 1…r]都已排序。合并这两个子数组形成单一的已排序好子数组并代替当前的子数组A[p…r]

合并排好序的数组伪代码

    MERGE(A, p, q, r)
    1  n1 = q - p + 1
    2  n2 = r - q
    3  let L[1..n + 1] and R[1..n2 + 1] be new arras
    4  for i = 1 to n1
    5     L[i] = A[p + i -1]
    6  for j = 1 to n2
    7     R[j] = A[q + j]
    //设置哨兵
    8  L[n1 + 1] = ∞
    9  R[n2 + 1] = ∞
    10 i = 1
    11 j = 1
    12 for k = p to r
    13    if L[i] <= R[j]
    14       A[k] = L[i]
    15       i = i + 1
    16    else A[k] = R[j]
    17         j = j + 1

推导过程:

  • 初始化:循环不变式的第一次迭代前,k = p,子数组A[p…k-1]为空,空的子数组包含L、R的的r-p = 0个最小元素。
    因为i = j = 1,所以L[i]、R[j]为各自子数组的第一个最小的元素

  • 保持:假设L[i] <= R[j],则L[i]是未被复制到A中的最小元素。因为A[p, k-1]包含 k - q个元素,代码第14行将L[i]复制回A[k]后,A数组将包含k - q + 1个元素。增加i、k的值后为下次迭代重新建立了循环不变式。反之,若L[i] > R[i],则16~17行执行适当的操作维持循环不变式

  • 终止:终止时k = r + 1,根据循环不变式,子数组A[p…k-1]就是A[p…r]且按从小到大的顺序包含L[1…n1 + 1]和
    R[1…n2 + 1]中的k-p = r - p + 1个最小元素。数组L和R一起包含n1 + n2 + 2 = r - p + 3个元素。初两个最大的哨兵
    元素外其余元素都被复制回数组A

归并排序伪代码

    MERGE-SORT(A, p, r)
    1   if p < r
    2       q = (p + r)/2  //向下取整
    3       MERGE-SORT(A, p, q)
    4       MERGE-SORT(A, q + 1, r)
    5       MERGE(A, p, q, r)

归并排序的过程就是不断递归的将数组进行二分拆分后合并排序的过程

Java实现

实现代码

    package com.aim.algorithm.sort.impl;

    import com.aim.algorithm.sort.Sort;
    import org.springframework.stereotype.Service;

    @Service
    public class MergeSort implements Sort {
        @Override
        public int[] sort(int[] input) {
            mergeSort(input, 0, input.length-1);
            return input;
        }

        public void mergeSort(int[] input, int start, int end){
            if(start < end){
                int mid = (int) Math.floor(((double) start + end)/2);
                mergeSort(input, start, mid);
                mergeSort(input, mid + 1, end);
                merge(input, start, mid, end);
            }
        }

        private void merge(int[] input, int start, int mid, int end){
            int l = mid - start + 1;
            int r = end - mid;
            int[] left = new int[l + 1];
            int[] right = new int[r + 1];
            for(int i = 0; i < l; i++){
                left[i] = input[start + i];
            }
            for(int j = 0; j < r; j++){
                right[j] = input[mid + j + 1];
            }
            left[l] = Integer.MAX_VALUE;
            right[r] = Integer.MAX_VALUE;
            int i = 0;
            int j = 0;
            for(int k = start; k <= end; k++){
                if(left[i] <= right[j]){
                    input[k] = left[i];
                    i++;
                }else {
                    input[k] = right[j];
                    j++;
                }
            }
        }
    }
(project generation have a problem)STM32CubeMX生成工程一直报错项目生成有问题[玄学三步解] 解决办法 第一步,检查自己是不是真的配置的不对,JAVA安装没,pack路径设置的对不对,这里有一位前辈的博文写的非常好,附加链接https://blog.youkuaiyun.com/ybhuangfugui/article/details/52225736#commentBox 第二步,如果按照前辈的博文设置的都一模一样,还是不对,想我下图这样。 那你来对地方了 方法很简单,你把你生成工程文件的路径彻底的... 阅读详情

相关推荐

Python经常遇到导入xlwings就出错,如何解决

Python经常在导入xlwings时遇到错误。有人建议尝试重装或升级xlwings,但这些操作后仍然无法解决导入错误问题。

felix_8的博客 1740

排序算法之二——合并排序

有很多算法在结构上是递归的:为了解决一个给定的问题,算法要一次或多次地递归调用起自身来解决相关的子问题 。这些算法通常采用分治策略:将原有问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 分治模式在每一层递归上都有三个

stillvxx的专栏 1446

SAP PI实战:5分钟搞定REST适配器同步接口配置(含Postman测试技巧)

本文详细介绍了如何在SAP PI中快速配置REST适配器同步接口,包括ESR设计、集成流配置及Postman测试技巧。通过实战步骤和关键参数设置,帮助开发者高效实现系统集成,特别适合需要实时数据交互的业务场景。

weixin_33738555的博客 485

归并排序(Merge Sort)

#include #include void Merge(int a[],int p,int q,int r) { int n1=q-p+1; int n2=r-q; int *L=(int *)malloc(sizeof(int)*(n1)); int *R=(int *)malloc(sizeof(int)*(n2)); for(int i=0;i<n1;i++) //

winbobob的专栏 558

高速串行信号仿真避坑指南:为什么你的SIwave Xnet设置了却不出结果?

本文深入解析SIwave中Xnet功能在高速串行信号仿真中的常见问题,包括模型缺失、网络不完整和端口设置错误等关键误区。通过详细的电路元件模型验证、网络完整性检查及端口配置指南,帮助工程师有效解决仿真不出结果的问题,提升信号完整性分析效率。

weixin_29218963的博客 255

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1047

c语言mergesort 参数,归并排序C语言兑现MergeSort

归并排序C语言实现MergeSort是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divideand Conquer)的一个非常典型的应用。算法伪码:MERGE-SORT(A,p, r)if p < rthen q = (p + r) / 2MERGE-SORT(A,p, q)MERGE-SORT(A,q+1, r)MERGE(A,p, q, r)下面的程序中,假设A是数组,...

weixin_36247564的博客 797

3DGS实战避坑指南:从零搭建到成功训练

本文详细介绍了3D Gaussian Splatting(3DGS)从环境配置到成功训练的实战避坑指南。涵盖git clone的正确使用、依赖安装的隐藏陷阱、CUDA版本兼容性解决方案、首次训练验证、常见报错急救方案、性能优化技巧及可视化调试方法,帮助开发者高效搭建和训练3DGS模型。

weixin_29053383的博客 367

算法之归并排序

归并排序是分治法(divide-and-conquer)的经典案例。 分治模式在每一层递归上都有三个步骤: 分解(Divide):将原问题分解成一系列子问题; 解决(Conquer):递归地解各子问题。若子问题足够小,则直接求解; 合并(Combine):将子问题的结果合并成原问题的解。 归并排序(merge-sort)算法完全依照了上述模式,具体的操作细节如下图: 合并的程序伪代...

WaxAndWane1996的博客 344

【知识图谱】neo4j安装与配置_社区版_2025(附完整安装软件包)

(经历过各种版本NEO4J,遇见杂七杂八的各种问题,也看过非常多很好的教程,特此来分享一下,为大家排排坑。

知识靠谱的博客 2万+

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)和实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)和Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2021

归并排序详解

摘要:归并排序是我们常用的八大排序中的一种,其排序思路中和快速排序算法一样使用到了递归的思想,同时在归并排序中还用到了一个算法,就是有序数组合并算法。配合递归与有序数组合并算法,归并排序能够高效且稳定的完成排序,归并排序的优点在于其时间复杂度低,稳定性高,但是缺点也是有的,那就是空间复杂度很高。

云杉木屋 2万+

Python全栈项目--手机语音远程控制智能家居系统(含嵌入式控制)

摘要:本项目实现了一个基于Python全栈的智能家居语音控制系统,支持手机端语音指令控制家居设备。系统采用FastAPI后端+Vue3前端的架构,集成Web Speech API实现语音识别,通过嵌入式设备(如ESP32)执行硬件控制。功能包括用户认证、设备管理、场景联动、指令解析和日志记录,支持HTTP轮询和直推两种命令下发模式。项目涵盖物联网全链路开发,适用于课程设计或毕业设计原型开发。

exlink2012的专栏 885

常见排序算法之归并排序——归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法 (Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序 列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。...

保护小周ღ的博客 2403

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

归并排序与自然归并排序

1.归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题2.时间复杂度:O(N * logN)3.空间复杂度:O(N)4.稳定度:稳定.1.这玩意的思路相比于其它排序其实特别恶心,在生产环境中非常不建议使用,你的项目组成员可能会骂街(除非是这种情况:就比如你的数据结构老师心血来潮让你讲这个,那你也没办法...)2.时间复杂度:遍历了一次:O(n)3.空间复杂度:O(n)

asdssadddd的博客 1149

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

归并排序-自底向上的归并排序算法

归并排序 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 算法描述 分解: 将原序列分解成length长度的若干子序列 求解子问题: 将相邻的两个子序列调用Merge算法合并成一个有序子序列 合并: 由于整个序列存放在数字a中,排序过程是就地进行的,合并步骤不需要执行

qq_45727976的博客 2990

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

归并排序的一些拓展应用

归并排序的一些拓展问题, 包含小和问题, 逆序对问题, 翻转对问题, 区间和的个数问题.

trong_ 的烂笔头 870

链表的归并排序

链表的归并排序是一种高效、稳定的排序算法,非常适合链表这种数据结构。通过分治思想,将链表不断分割并合并,实现了对链表的排序。

2401_86909484的博客 1174

排序算法 归并排序(普通归并排序、自然归并排序)

自然归并排序:对于初始给定的数组,通常存在多个长度大于1的已自然排好序的子数组段.例如,若数组a中元素为{4,8,3,7,1,5,6,2},则自然排好序的子数组段有{4,8},{3,7},{1,5,6},{2}.用一次对数组a的线性扫描就足以找出所有这些排好序的子数组段.然后将相邻的排好序的子数组段两两合并,构成更大的排好序的子数组段({3,4,7,8},{1,2,5,6}).继续合并相邻排好序的子数组段,直至整个数组已排好序。(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。

qq_36511401的博客 1万+

数组排序之归并排序

归并排序(Merge Sort)是数组排序算法中一种常见的算法,其主要思想为经典的“分治思想”。本文将介绍数组排序算法中的归并排序,并介绍其相关应用。

山阴少年 2487

归并排序及模板

文章目录归并排序理解归并排序模板 归并排序理解 归并排序的主要操作如下: (1)分解。把初始序列分成长度相同的左、右两个子序列,然后把每个子序列再分成更小的两个子序列,直到子序列只包含一个数。这个过程用递归实现。 (2)求解子问题,对子序列排序。最底层的子序列只包含一个数,其实不用排序。 (3)合并。归并两个有序的子序列,这是归并排序的主要操作。比如下面举例,把a[ ]分成两个子序列,比较后存进b...

ker的博客 2050

归并排序算法、多路归并排序

base case:if(left>=right) return; 归并排序左半边,归并排序右半边,合并 void merge_sort(vector<int> &nums,vector<int> reg,int start,int end){ if(start>=end) return ; int mid=(end-start)/2+start; int start1=start,end1=mid; int start2=mid+

大灰狼吃树皮 4003

C++ 归并排序

归并排序的原理: (1)首先,把一个数组以中间元素为界限分成两组; (2)然后“左边数组”和“右边数组”中的元素分别进行比较; (3)最后合并两个已经排好顺序的数组,我们称之为归并排序。 #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; /**************************...

辛旭东小小工作室 1316
上一篇: 插入排序
下一篇: 副本机制和其他控制器
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值