分治策略之合并排序问题

分治算法 分治问题学习笔记 一.分治策略的思想 ​ 分治–分而治之,将某问题,分为n个子问题,对n个子问题逐个击破,再对子问题处理结果进行合并,得到最终问题的解。 二.步骤 ​ 分:将问题分成合适个数的子问题(根据问题的规模来考虑子问题的个数,既要考虑到并行计算的 能力,也要考虑结果合并处理的开销); ​ 治:将小规模的子问题逐个击破(这一步可以采用 多线程并行计算提高运算速度); ​ 合:将解决后的子问题进行合并,得到最终问题的解。 三.注意问题 ​ 1.分成子问题的数量,需要考虑子问题结果合并的开销; 阅读详情

基本思想:

将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的合。

例如:

算法mergeSort的递归过程可以消去。


//合并排序(递归)
#include <iostream>

using namespace std;


template <typename Type>
void Copy(Type a[],Type b[], int left, int right)
{
    //复制回数组a
    for(int i = left; i <= right; i++ )
    {
        a[i] = b[i];
    }
}

template <typename Type>
void Merge(Type a[], Type d[],int l,int m, int r)
{
    //合并c[l:m]和c[m+1:r]到d[l:r]
    int i = l, j = m+1, k =l;
    while((i <= m) && (j <= r))
    {
        if(a[i] <= a[j])
        {
            d[k++] = a[i++];
        } else {
            d[k++] = a[j++];
        }
    }
    if(i > m)
    {
        for(int q = j; q <= r; q++)
            d[k++] = a[q];
    } else {
        for(int q = i; q <= m; q++)
            d[k++] = a[q];
    }
}


template <typename Type>
void MergeSort(Type a[], int left, int right)
{
    int *b = new int[left+right+1];
    if(left < right)
    {
        //至少有2个元素
        int i = 0;
        //取中点
        i = (left + right)/2;
        MergeSort(a,left,i);
        MergeSort(a,i+1,right);

        //合并到数组b
        Merge(a,b,left,i,right);

        //复制回数组a
        Copy(a,b,left,right);
    }
}


int main()
{
    //int a[8] = {5,6,7,8,1,2,3,4};
    int n;          //输入数字个数
    cout<<"输入要排序数字的个数:"<<endl;
    cin>>n;
    int *a = new int[n];
    cout<<"输入要排序数:"<<endl;
    for(int i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    MergeSort(a,0,n-1);
    cout<<"输出排序后的数列:"<<endl;
    for(int i = 0; i < n; i++)
        cout<<a[i]<<" ";
    delete[] a;
    return 0;
}


分治策略详解 算法及伪代码 选择 排序 ppt 2.1 分治策略的基本思想 2.1.1 分治算法的一般性描述 2.2 分治算法的分析 2.3 改进分治算法的途径(不做要求) 2.3.1 通过代数变换减少子问题个数 2.3.2 利用预处理减少递归内部的计算量 2.4 典型实例 2.4.1 求最大最小元 2.4.2 排序问题 2.4.3 选择问题 立即下载

相关推荐

分治法合并排序算法实现merge

分治法求解排序问题 合并为其中一种 效率不错 时间复杂度为O nlogn 代码有本人大量解释 便于理解

(算法复习-) 递归 & 分治 详解

递归和分治从解决问题的角度上讲是息息相关的、甚至从根本上就无法分开,递归本身就实际包含着分治的思想、而分治又必须要用到递归的手段,所以这里把递归和分治放到一起来讲。 文章不可避免的会有些长,而我的笔记又尽可能的会把语言放简洁,这样便容易导致好多看这篇文章的人看不懂,如果出现了这样的情况,请尽可能在评论栏留言,我会一一回复并争取对文章进行向好的修改 -----------------------...

想要暖手宝..如果是夏天的话想要空调 916

分治策略 合并排序 快速排序 代码 C语言

分治策略 合并排序 快速排序 代码 C语言 是自己写的程序,还请各位指教

【面试经典 150 | 分治】合并 K 个升序链表

【面试经典 150 | 分治】合并 K 个升序链表 +【分治】+【优先队列】.

weixin_54383080的博客 1322

用Quartus II和LPM_ROM手把手复现西电计组课设:从微指令到五条指令的完整流程

本文详细介绍了使用Quartus II和LPM_ROM复现西电计组课设的完整流程,从微指令编写到五条指令的实现。通过环境搭建、LPM_ROM配置、微程序设计及调试技巧,帮助读者高效完成课程设计,避开常见问题。适合计组课程设计的学习者和实践者参考。

weixin_29288313的博客 456

我的二进制漏洞挖掘学习路线

漏洞挖掘也分好多方向:浏览器漏挖,虚拟化,iot,车联网,应用安全等。而且也要区分一下平台,Linux,Android,Windows,还有一些其他的系统。在基础知识拿捏以后,Windows下如OD,windbg,x64dbg。IDA,GDB要会并联调。然后需要了解一下漏洞的知识,漏洞利用的知识。可以从复现漏洞,CTF来学习,学习完之后就可以通过审计源码或者反汇编二进制程序来挖掘。然后就是练就行了,多关注一下最新安全消息,安全漏洞。

qq_36918532的博客 4943

分治法-合并排序

1.合并排序 排序算法是对一组数进行顺序排序或者逆序排序,而合并排序就是排序算法的一种。合并排序用到了分治策略实现对元素进行排序。 合并排序的基本思想:把待排序的n个元素分解成n组,也就是每组一个元素;之后对分好的组进行两两合并(无配对的则不操作),以此类推。 以序列{8, 3, 2, 6, 7, 1, 5, 4}为例,排序过程如下: 排序过程 图片来源 合并排序又叫做2-路归并排序...

bull521的博客 8350

Outlook总是提示登录微软,怎么办?

Outlook 2021反复弹出Microsoft登录窗口,可能是由于Modern Authentication身份验证机制或凭据问题导致。解决方案包括:1)通过注册表关闭Modern Authentication(适用于本地Exchange);2)清理Windows凭据管理器中的旧认证信息;3)手动配置Exchange服务器地址;4)通过注册表阻止Microsoft登录窗口弹出(适用于非M365环境)。建议按顺序尝试,尤其前两步通常能解决问题。经测试,步骤1和2已有效解决该问题。

剪刀石头布 4663

合并排序——分治策略

1.合并排序是分治法的

hgk324的专栏 778

使用mne包来对脑电数据进行预处理(一)

MNE(MNE-Python)是一个用于处理脑电(EEG)、磁图(MEG)和其他神经科学数据的Python库。它提供了丰富的功能,包括数据加载、预处理、分析和可视化,旨在帮助研究人员和神经科学家更轻松地进行脑电数据的处理和分析。在本文中,我们使用mne来对不同的格式的脑电数据集进行数据读取。

m0_71596228的博客 4303

架构——异地多活成熟的架构模式

摘要: 本文系统介绍了三种异地多活架构模式:业务定制型、业务通用型和存储通用型。业务定制型针对核心业务定制化设计,复杂度低但扩展性差;业务通用型通过统一配套服务(流量调度、配置中心等)实现多业务兼容,适合业务量大但一致性要求不高的场景;存储通用型依托分布式一致性数据库(如OceanBase、TiDB)天然支持强一致性,适合金融等高要求场景,但对部署距离和成本有较高限制。文章对比了各模式的优缺点及适用场景,为不同业务需求下的架构选型提供了实践指导。

小志的博客 7085

基于分治策略的合并排序算法解决问题

题目:给定一个包含n个元素的一维线性序列a[left:right],对这n个元素按照非递减顺序排序。设a=[23,5,9,16,30,25,17,18],采用基于分治策略的合并排序算法解决该问题。 (a)简述合并排序算法基本思想以及步骤。 (b)写出算法实现代码并截屏程序的运行结果。 (c)写出该算法所需计算时间的递归方程,并写出求解结果。

执着&你 1908

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 538

分治策略(二分查找,排列问题,整数划分,合并排序,堆排序,快速排序,线性选择,最大子段和问题)

把规模大的问题,分成规模小的多个问题,逐个解决。把原问题分割成若干问题,且这些子问题是可解的,这些问题可以解决原问题。

2402_84699040的博客 194

QGIS基于快鸟(QuickBird)影像统计小麦种植面积

​01数据情况 本次选用某地4月份快鸟(QuickBird)影像为例,使用QGIS演示提取小麦播种情况,并按照200米*200米分区计算种植面积的过程。 注:本文对应的操作视频作为今天第二篇推送同时发布,习惯看视频的朋友可以点击观看。 附数据压缩包: 链接:https://pan.baidu.com/s/1JVUS8uAOR61RxC1n9Or9_w 提取码:qgis 含快鸟影像QB_subset.tif和200*200米分区矢量图层200Mgrid.shp。 ...

QGISClass的博客 1979

47、利用组策略配置 Windows 防火墙与 IPsec 全解析

本文深入解析了如何利用组策略配置Windows防火墙与IPsec,涵盖防火墙规则基础、IPsec身份验证与加密机制、服务器和域隔离实现方法、WFAS中新旧IPsec规则的区别与配置流程,并详细说明了防火墙属性与规则的优先级计算方式。同时介绍了证书服务、EFS等未详述的安全功能及相关学习资源,帮助管理员通过组策略有效提升网络安全性。

onion的博客 101

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

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

smallrain6的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

利用分治策略解决 逆序对计数问题 Counting Inversion Problem

对于逆序对计数问题如果我们用普通的算法即循环嵌套比较能确实能解决,但是不够高效,我们使用分治策略能更有效的解决这个问题,并且在解决这个问题的过程中理解分治、递归等思想。

2401_84452741的博客 1405

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

(二)合并排序

/************************************* 分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题; 递归地解决这些子问题,然后再合并其结果,得到原问题的解。 分治模式三部曲:分解、解决、合并。 合并排序伪代码(使用哨兵): merge(A,p,q,r): n1 <—— q-p+1 n2 <—— r-q cre

JJDiaries 1190

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

分治策略

分治策略 1.算法总体思想 1.1分治法的设计思想 1. 当要求解一个输入规模n相当大的问题时,直接求解往往是非常困难的,甚至没法求出。正确的方法是, 首先应仔细分析问题本身所具有的特性,然后根据这些特性选择适当的设计策略来求解。 2. 在将这n个输入分成k个不同子集合的情况下,如果能得到k个不同的可独立求解的子问题,而且在求解之后,还可找到适当的方法把它们合并成整个问题的解,那么,可考虑使用分治法来求解。 1.2分支法的使用条件 ​ 分治法所能解决的问题一般具有以下几个特征: **该问题的***

qq_41057728的博客 393

快速排序、合并排序和分治策略的基本思想

分治策略的基本思想:就是对于一个问题规模为N的问题,将其划分为规模足够小的K个子问题,子问题由于规模足够小可以直接求解,最后将规模足够小的K的问题的解合并得出原问题的解。 合并排序主要的思想:将待排序列拆分至数个足够小的子序列,然后将相邻子序列合并为一个有序子序列,重复合并相邻有序子序列直到整个序列有序。 快速排序的主要思想:将待排序列拆分为左右两个子序列A,B,使得子序列A的元素都小于子序...

Sweet77 2006

分治算法详解

本篇博客的主要内容如下1. 什么是分治算法2. 分治算法的解题步骤3. 分治算法的例题 1. 什么是分治算法     分治就是 “分而治之”,其本质就是将原问题分解成规模更小的子问题,然后将子问题求解的结果合并成原问题的答案。其实有很多算法本质上都是这个思想,比如说动态规划通过状态转移方程从子问题的最优解推导出全局的最优解,又比如说递归通过递推关系式将问题不断分解成和原问题相似但是规模更小的子问题。 2. 分治算法的解题步骤 分治的核心思想就是:分解+合并:      分解:将原问题(大问题)分解成和原问题

Peealy的博客 3468

递归与分治策略

递归与分治策略 文章目录递归与分治策略一、递归1.区别递归与循环二、分治1.基本思想2.适用情况2.基本步骤3.递推方程的求解方法4.算法复杂度分析三、排序问题1.合并排序2.快速排序四、经典递归分治问题1.平面最接近点对问题2.棋盘覆盖问题3.选择问题4.循环赛日程表总结 一、递归 1.区别递归与循环 递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它。若干次之后,你打开面前的门后,发现只有一间屋子,没有门了。然后,你开始原路返

linghaoo的博客 543

快速排序(分治策略)

2.求解子问题:子序列的长度是0或者1表示有序,否则递归求解各个子问题;1.分解:原序列a[1…i-1]和a[i+1…3.合并:把各个子系列的结果合并到数组a中即可。

weixin_63497136的博客 453

理解分治算法(二分查询,归并排序)

title: “理解分治算法(二分查询,归并排序)” tags: 算法 1. 什么是分治算法 在计算机科学中,分治法是建基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 这个技巧是很多高效算法的基础,如排序算法(快速排序、归并排序)、傅立叶变换(快速傅立叶变换)。 另一方面,理解及设计分治法算法的能力需要一定时间去掌握。正如以归纳法去证明一个理论,为了使递归能够.

wsk1103 801
上一篇: 分治策略之全排列问题
下一篇: 模拟时间片轮转法
Hy_Fighting
博客等级 码龄15年 11粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值