归并排序(分治思想)

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流 本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。 阅读详情
  • 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
  • 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。

    - 1. 基本思想
    归并排序是用分治思想,分治模式在每一层递归上有三个步骤:
    分解(Divide):将n个元素分成个含n/2个元素的子序列。
    解决(Conquer):用合并排序法对两个子序列递归的排序。
    合并(Combine):合并两个已排序的子序列已得到排序结果。


动图演示:
这里写图片描述
具体的我们以一组无序数列{14,12,15,13,11,16}为例分解说明,如下图所示:
这里写图片描述
上图中首先把一个未排序的序列从中间分割成2部分,再把2部分分成4部分,依次分割下去,直到分割成一个一个的数据,再把这些数据两两归并到一起,使之有序,不停的归并,最后成为一个排好序的序列。


代码实现:

#include<iostream>
using namespace std;
void Merge_Sort(int a[],int b[],int left,int right);
void merge(int origin[],int destin[],int left,int middle,int right);
int main()
{
    int i,n;
    int a[100],b[100];
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    Merge_Sort(a,b,0,n-1);
    for(i=0;i<n-1;i++)
        cout<<a[i]<<" ";
    cout<<a[i]<<endl;
    return 0;
}

//内部使用递归 
void Merge_Sort(int a[],int b[],int left,int right)
{
    int middle;
    if(left<right)
    {
        middle = (left+right)/2;
        Merge_Sort(a,b,left,middle);
        Merge_Sort(a,b,middle+1,right);
        merge(a,b,left,middle,right);     //合并到数组b 
    }
}


void merge(int origin[],int destin[],int left,int middle,int right)
{
    int i=left,j=middle+1,k=left;
    while(i<=middle&&j<=right)
    {
        if(origin[i]<origin[j])
            destin[k++]=origin[i++];
        else
            destin[k++]=origin[j++];
    }

    //处理剩余元素 
    while(i<=middle)
        destin[k++]=origin[i++];
    while(j<=right)
        destin[k++]=origin[j++];

    for(k=left;k<=right;k++)
        origin[k]=destin[k];
}
ESD防护设计宝典(十一):CE(传导发射)超标问题排查与解决 (Conducted Emission, CE),亦称为传导骚扰,是电子电气设备或系统内部的电压、电流通过信号线、电源线或地线向外传输,对其他电子电气设备或系统造成电磁干扰的物理现象。其。 阅读详情

相关推荐

ROS2+MoveIt2+Gazebo仿真实战:从零搭建六轴机械臂控制闭环

本文详细介绍了如何从零搭建一个完整的ROS2+MoveIt2+Gazebo六轴机械臂仿真控制闭环。通过手写URDF模型、配置MoveIt2运动规划、集成Gazebo物理仿真与ROS2 Control控制器,最终实现RViz中规划轨迹、Gazebo中同步执行的完整数字孪生验证平台,为机器人算法开发和硬件验证提供低成本、高效的仿真解决方案。

weixin_29093017的博客 486

归并排序的实现

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 //将有序数组a[]和b[]合并到c[]中 void Meme...

1577

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 546

【详解】归并排序(分治思想)

1、基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。 2、合并相邻有序子序...

CodingLJ 1206

卡方检验的隐藏逻辑:为什么正态分布的平方和如此重要?

本文深入探讨了卡方检验的核心逻辑,揭示了正态分布平方和在统计检验中的重要性。通过分析卡方分布与伽马分布的关系,以及实际应用案例,帮助读者理解卡方检验的原理、局限及高级应用场景,为数据分析提供有力工具。

3a9bq4r8t2y的博客 208

主流双目相机技术参数横向评测:从ZED到国产新锐

本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。

weixin_33670786的博客 318

【算法(三·一):分治思想——归并排序】

本文介绍了归并排序的思想、实现步骤、伪代码、优缺点等。

计算机领域博客,与时俱进的思想与技术。 435

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

WW、forever的博客 488

归并排序——分治思想

1 概述 归并排序是指利用归并操作的一种排序方法。规定是指将两个或两个以上的有序表组合成一个新的有序表的过程。 2 基本思想 归并排序的基本思想是将n个元素的初始序列看成n个成都为1的子序列,两两归并,得到n/2个长度为2或1的子序列,再两两归并,直到得到一个长度为n的有序序列为止。归并排序的核心操作时归并,而整个归并排序的处理过程可用递归方式完成。 具体原理如下: 1)有一数组如下,我们使用归并...

我是张跑跑 1803

18006.STM32通过SPI读取LAN9253数据

【代码】18006.STM32通过SPI读取LAN9253数据。

写给自己的笔记 556

操作系统实验一到实验九合集(哈工大李治军)

操作系统实验一到实验九合集(哈工大李治军) 有详细代码及注释,程序已在本地测试,均能跑通

leoabcd12的博客 5万+

算法基础15 —— 分治算法(归并排序 + 快速排序)

分治法的基本概念、思想 分治法是一种很重要的算法。 字面解释,分治分治,分而治之。就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 不难发现,分治法的思想与递归极其类似。实际上,分治与递归确实是密不可分。 分治法的策略 将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破。 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模1较小)则直接解决,否则将其分解为k个规模较小

smallrain6的博客 1万+

5G无线关键技术 — 新型传输波形技术和先进编码与调制技术

目录 1、OFDM传输波形技术 2、滤波器组多载波 (Filterbank multicarrier:FBMC) 3、先进编码与调制技术 4、空间调制(Spatial Modulation SM) 5、频率正交幅度调制 1、OFDM传输波形技术 OFDM是当前Wi-Fi和LTE标准中的高速无线通信的主要传信模式。 LTECP配置 子载波间隔 CP长度Tcp 有用符号长度Tu CP比例..

Fanjufei的博客 2130

【分治思想】归并排序 与 逆序对

逆序对(Inversion)是指在一个序列中,如果前面的数比后面的数大,那么这两个数就构成一个逆序对。

2301_80361697的博客 1301

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

算法排序5——归并排序&分治思想

今天是21天挑战赛第二周,本文主要讲归并排序,也是分治思想的重要体现

Alita233_的博客 472

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

用分治思想理解归并排序

分治思想 分治就是把打的问题转成一个个小问题解决,然后把每个小问题的答案合并到一起就解决了大问题 分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。 思路: 可以说看了上图就秒懂了,把一个数组拆分成每一个具体的值,然后再两两合并并排序,到最后再把两大块合并成一个就是归并了 代码实现: ...

jiohfgj的博客 219

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

归并排序-分治思想的典型应用

前面的文章讲了二分查找算法,这种算法使用了一种非常常见的思想–“分治思想”。所谓分治,就是"分而治之",当解决一个大问题时,如果问题太大而无法直接解决,就可以试着把问题分解成很多个相互独立的子问题,将每个子问题各个击破,最后每个子问题得到的结果一合并就得出了原问题的结果,分治法一般都通过递归实现。本文讲解的归并排序就是分治思想的经典应用。 一.基本思想 分解:给出包含若干个数的一段序列。按照分治思想要把序列分成两部分,然后对每个部分,再以相同的方式分成两个更小的序列。就这样一直分下去,到最后每段序列.

qq_45329226的博客 539

分治思想的归并排序算法

今天看了算法导论上归并排序算法部分,应用了分治思想。将书上的伪代码用C++写了出来。但书中的数组下标都是从1开始而不是我们平时使用的从0开始,所以与书中稍有不同。 代码如下(注释用英语写的,如果写汉语,会有难看下划线,实在不喜欢): 1 #include <iostream> 2 using namespace std; 3 4 void mer...

133

归并排序:分治思想的高效排序

归并排序是一种基于分治思想的高效排序算法。其核心过程分为"分割"和"合并"两个阶段:先将数组递归分成最小单元,再将有序子数组逐层合并。算法实现包括递归和非递归两种方式,递归实现直观体现分治思想,非递归实现通过迭代控制合并区间。无论哪种方式,合并操作都需要额外空间存储临时结果。归并排序的时间复杂度为O(NlogN),是一种稳定的排序方法。算法需处理边界情况,如合并区间越界等问题。

2402_83315537的博客 1361

终极指南:10分钟用动画掌握归并排序的分治思想

归并排序是算法学习中的经典排序算法,通过algorithm-base项目的生动动画演示,即使是算法新手也能轻松理解其核心分治思想。归并排序采用"分而治之"的策略,将复杂问题分解为更小的子问题,然后合并结果得到最终解。 ## 🤔 什么是归并排序? 归并排序这个名字听起来很专业,其实原理很简单——就像公司选拔优秀员工一样!想象一下,一个公司要从各个部门选拔最优秀的员工参加全国比赛: **选拔流

gitblog_00009的博客 1060

分治法的基本思想_归并排序-分治思想的典型应用

前面的文章讲了二分查找算法,这种算法使用了一种非常常见的思想–"分治思想"。所谓分治,就是"分而治之",当解决一个大问题时,如果问题太大而无法直接解决,就可以试着把问题分解成很多个相互独立的子问题,将每个子问题各个击破,最后每个子问题得到的结果一合并就得出了原问题的结果,分治法一般都通过递归实现。本文讲解的归并排序就是分治思想的经典应用。一.基本思想1. 分解:给出包含若干个数的一段序列。按照分治...

weixin_39762838的博客 620

分治法的基本思想_分治算法与归并排序

距离上次写快排算法的文章已经过去一个半月了,和本文要提到的归并排序算法类似,快排也是分治思想的一种典型应用,如果有不熟悉快速排序的同学可以翻阅我之前写过的的快速排序算法的文章。分治算法首先为大家介绍一下什么是分治,分治是将一个大问题分割成若干个和原来问题形式相同但规模更小的子问题,然后处理这些小问题,最终实现整个大问题的过程。额...上面说的概念确实很难理解,我们换一个生活中的场景来介绍...

weixin_39962125的博客 412

计算数组逆序数(使用归并排序的分治思想)

分治思想 分解 解决子问题 合并 可以使用分治思想的问题有哪些特点: 原问题与分解成的子问题具有相同的模式 原问题分解成的子问题可以独立求解,子问题之间没有相关性 具有分解终止条件 可以将子问题合并成原问题,并且合并操作复杂度不能太高 以下以面向对象的方式实现归并排序相关功能: class Merge_sorter: def __init__(self): self...

肆拾柒分半 374

排序算法——分治思想与归并排序

1、分治法思想 分治思想主要通过递归来实现,每层递归中主要包括三个步骤: 分解:即将原问题划分为若干子问题,子问题的形式要保证和原问题一致,但规模更小。 解决:当划分子问题的规模足够小时,停止递归,求解子问题,获取子问题的解决结果并返回给上一层。 合并:将子问题的解...

chuangyangza0583的博客 589

归并排序详解:分治思想的经典应用

归并排序(Merge Sort)是一种基于**分治法(Divide and Conquer)**的高效排序算法,由冯·诺依曼于1945年提出。它的核心思想是: 1. **分(Divide)**:递归地将数组分成两半,直到子数组长度为1(天然有序)。 2. **治(Conquer)**:将两个有序子数组合并成一个更大的有序数组。

m0_59858691的博客 521

数据结构与算法 - 归并排序:分治思想的经典实现

归并排序是一种基于分治思想的经典排序算法,其核心步骤包括分解、递归排序和合并。本文将详细介绍归并排序的原理、实现和优化方法。通过Mermaid图表展示数组分解与合并过程,并以Java代码实现为例,解析递归排序和双指针合并的具体操作。文章还讨论了算法的时间复杂度(O(nlogn))和空间优化策略,如避免频繁创建临时数组。归并排序以其稳定性和可预测性,在大数据排序和外部排序中具有重要应用价值。无论是算法初学者还是开发者,都能从中获得启发。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 分治法
下一篇: 棋盘覆盖问题
弱爆了的雪饼
博客等级 码龄10年 76粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值