c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...

分治法

我们首先先介绍分治法。分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后在合并这些子问题的解来解决原问题的解。

还是拿扑克牌举例子,假设桌上有两堆牌面朝上的牌(牌面朝上:有值),每堆都已排序,最小的牌在顶上。我们希望把这两堆牌合并成单一的排好序的输出堆,牌面朝下地放在桌上。应该怎么做呢?

我们的做法是:在牌面朝上的两堆牌的顶上两张牌中选取较小的一张,将该牌从其堆中移开(该堆的顶上将显示一张新牌)并牌面朝下地将该牌放置到输出堆。重复这个步骤直到两堆牌都没有牌。

下面我们来实现上面所提的思想

为了避免在某个基本步骤必须检查是否有堆为空。在每个堆的底部放置一张哨兵牌,它包含一个特殊的值(很大的值,使它不可能是较小的牌,除非两个堆都已显露出其哨兵牌。一旦发生这种情况,说明非哨兵牌都已被放置到输出堆),用于简化代码。

伪代码:

MERGE(A,p,q,r)

n1 = q - p + 1

n2 = r - q

//L[1..n1+1] and R[1..n2+1]是新的数组

for i = 1 to n1

L[i] = A[p + i -1]

for j = 1 to n2

R[j] = A[q + j]

L[n1 + 1] = ∞

R[n2 + 1] = ∞

i = 1

j = 1

for k = p to r

if L[i] <= R[j]

A[k] = L[i]

i = i + 1

else

A[k] = R[j]

j = j + 1

Java实现:

public void Merge(int[] A,int p,int q,int r){

int n1 = q - p + 1;

int n2 = r - q;

//L[1..n1+1] and R[1..n2+1]是新的数组

int[] L = new int[n1 + 1];

int[] R = new int[n2 + 1];

for (int i = 0;i < n1;i++){

L[i] = A[p + i];

}

for (int j = 0;j < n2;j++){

R[j] = A[q + j + 1];

}

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 = i + 1;

}else{

A[k] = R[j];

j = j + 1;

}

}

}

下面我们来看一下分治法的步骤

对数组A[2,4,7,1,3,6]调用Merge(A,0,2,5)

初始状态

c847ee41d458b210c29c8aeec56d81f4.png

初始完L和R数组之后,现在进入for循环阶段。让L中i所指的值和R数组中j所指的值进行比较,把较小的值放入数组A中k所指的位置。并且让较小的值的索引i或j前进一格(+1)。因为L和R数组已经从小到大排好序了,所以找出来的最小值一定是当前L和R数组的最小值,放入了数组A中也是排好序的,所以让k前进一步,k=k+1,然后执行下一次循环。

第一此循环:i和j初始为0,k=p=0,让L[0]与R[0]进行比较 L[0]>R[0]所以R[0]是较小值,把A[0]替换为R[0]。让j=j+1,i保持不变。k=k+1=1,开启下一次循环。本次循环结果如下图所示:

A中的灰色位置包含将被覆盖的值,L和R中的灰色位置包含有待于被复制回A的值,A中的黄色位置包含它们的最终值,L和R中的黄色位置包含已被复制回A的值。

30d066f439610cd503f7f5097114164e.png

第二次循环:此时i=0,j=1,k=1,让L[i]和R[j]进行比较,L[0]

30fc750bcef46812212a6a62c5499cf5.png

第三次循环:此时i=1,j=1,k=2,让L[i]和R[j]进行比较,L[1]>R[1],所以R[1]是较小值,把A[2]即A[2]替换为R[1]。让j=j+1,i保存不变。k=k+1=3,开启下一次循环。本次循环结果如下图所示:

81a1ce1e518a09456531853b8e0dcdc4.png

第四次循环:此时i=1,j=2,k=3,让L[i]和R[j]进行比较,L[1]

74fdbfc605eabe7f798e7475b8153bd9.png

第五次循环:此时i=2,j=2,k=4,让L[i]和R[j]进行比较,L[2]>R[2],所以R[2]是较小值,把A[k]即A[4]替换为R[2]。让j=j+1,j保存不变。k=k+1=4,开启下一次循环。本次循环结果如下图所示:

91c009640290e508426aba155db1c5f2.png

注意:此时j已经到达了R数组的最后一个数∞,L数组中的每个数都比∞小,即不等式L[i]>R[j]恒成立。所以不管L剩下多少个数,都会按照顺序放置A中,直到i也达到了最后一个数∞,此时k>r,循环已经全部结束。

第六次循环:此时i=2,j=3,k=5,让L[i]和R[j]进行比较,L[2]

377e73b42ad8edaca37c0445acee62cb.png

第七次循环,此时i=2,j=3,k=6,我们的r=5,判断条件k<=r为false,循环结束。

分治法的应用——归并排序

上面讲到了分治法,分治法有个很大的限制就是L和R是排好序的才可以。但是许多数组都是很乱的顺序。那么怎么解决这个问题呢?试想一下如果L和R数组的大小为1,那么L和R数组肯定是排好序的。对的!我们可以把一个大的数组递归拆分成小的子数组,子数组在递归拆分成更小的子数组。直到递归到的L和R数组的大小为1时,调用MERGE分治法。随着算法自底向上地推进:合并只含1项的序列对形成长度为2的排好序的序列,合并长度为2的序列对形成长度为4的排好序的序列,依次下去,直到长度为n/2的两个序列被合并最终形成长度为n的排好序的序列,数组最终会排序完成。

如下图所示

b9fdd5b687f9d0f0a773573c461b5d1d.png

我们可以把上面提到的MERGE作为归并排序算法中的一个子程序来用。

下面的过程MERGE-SORT(A,p,r)排序子数组A[p…r]中的元素。若p>=r,则该子数组最多有一个元素,所以已经排好序。否则,分解步骤简单地计算一个下标q,将A[p…r]分成两个子数组A[p…q]和A[q+1…r],前者包含⌈n/2⌉个元素,后者包含⌊n/2⌋个元素。

伪代码:

MERGE-SORT(A,p,r)

if p < r

q = ⌊(p+r)/2⌋

MERGE-SORT(A,p,q)

MERGE-SORT(A,q+1,r)

MERGE(A,p,q,r)

java实现:

public void MergeSort(int[] A,int p,int r) {

if (p < r){

int q =(int)Math.floor((p+r)/2);

MergeSort(A,p,q); //将左半边排序

MergeSort(A,q+1,r); //将右半边排序

Merge(A,p,q,r); //归并结果

}

}

下面我们来看一下归并排序在数组A=[5,2,4,7,1,3,2,6]上的操作,随着算法自底向上地推进,待合并的已排好序的各序列的长度不断增加。

60a38b8e601cbede4deb9673075893c1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon相关的链接

论坛、培训 halcon学习网&#xff1a;http://www.ihalcon.com/鸟叔机器视觉&#xff1a;http://bbs.szvbt.com/forum.php 博客 韩兆新的博客园majunfuLife and Codingzhaojun的博客風韻無聲骑蚂蚁上高速的博客小马_xiaoLV2小新识图程序园-程序员的世界章柯渊的博客 注&…

python opencv图像处理程序_Python-OpenCV学习(四):基本图像处理

转载请注明出处&#xff1a;danscarlett的博客园 参考资料&#xff1a; 目录&#xff1a; 读取 imread 显示 imshow 存储 imwrite 缩放 resize 加边框 copyMakeBorder 裁剪 img[x_start:x_end,y_start:y_end] 1.图像读取&#xff1a; cv2.imread(fileName,flagsNone) 函数功能&…

分针网——怎么轻松学习JavaScript

js给初学者的印象总是那么的“杂而乱”&#xff0c;相信很多初学者都在找轻松学习js的途径。我试着总结自己学习多年js的经验&#xff0c;希望能给后来的学习者探索出一条“轻松学习js之路”。js给人那种感觉的原因多半是因为它如下的特点&#xff1a;A&#xff1a;本身知识很抽…

python时间序列分析航空旅人_用python做时间序列预测一:初识概念

利用时间序列预测方法&#xff0c;我们可以基于历史的情况来预测未来的情况。比如共享单车每日租车数&#xff0c;食堂每日就餐人数等等&#xff0c;都是基于各自历史的情况来预测的。 什么是时间序列&#xff1f; 时间序列&#xff0c;是指同一个变量在连续且固定的时间间隔上…

[Logstash-input-redis] 使用详解

2019独角兽企业重金招聘Python工程师标准>>> Redis插件参数配置详解 工作流程 logstash启动redis插件redis插件获取参数&#xff0c;进行校验工作判断监听模式(list,channel,pattern_channel等)&#xff0c;根据不同的监听模式创建监听任务创建redis实例&#xff0c…

雅可比旋转求解对称二维矩阵的特征值和特征向量

问题描述&#xff1a; 给定一个矩阵&#xff0c;如下&#xff1a; A[a11a21a12a22]A=\begin{bmatrix} a_{11}&a_{12}\\ a_{21}& a_{22} \end{bmatrix} 其中满足a12a21.也就是所谓的 对称矩阵。那么如何求解此矩阵的特征值以及特征向量呢&#xff1f;这里我们要用到 …

python画图数据的平均值怎么算的_Python气象数据处理与绘图(2):常用数据计算方法...

对于气象绘图来讲&#xff0c;第一步是对数据的处理&#xff0c;通过各类公式&#xff0c;或者统计方法将原始数据处理为目标数据。 按照气象统计课程的内容&#xff0c;我给出了一些常用到的统计方法的对应函数&#xff1a; import numpy as np 平均值 在计算气候态&#xff0…

Linux下nginx安装与配置

部分Linux发布版的默认安装已经集成了nginx&#xff0c;查看方法ls /usr/local&#xff0c;若已有nginx文件夹说明已集成。nginx依赖库pcre与zlib&#xff0c;且pcre依赖于gcc与gcc-c&#xff0c;因此安装步骤为&#xff1a;安装gcc与gcc-c库安装pcre库安装zlib库安装nginx详细…

几种字符串加密解密的方法

为什么80%的码农都做不了架构师&#xff1f;>>> 第一种&#xff1a;〔 Python 与 Bash Shell 的结合 〕 这个命令会让你输入一个字符串&#xff0c;然后会再输出一串加密了的数字。 加密代码[照直输入]: python -c print reduce(lambda a,b: a*256ord(b), raw_inpu…

java delegate怎么写_美团面试官:你说你们公司的Mybatis分页插件是你写的,给我说说它的设计原理?...

来源&#xff1a;http://my.oschina.net/zudajun大多数框架&#xff0c;都支持插件&#xff0c;用户可通过编写插件来自行扩展功能&#xff0c;Mybatis也不例外。我们从插件配置、插件编写、插件运行原理、插件注册与执行拦截的时机、初始化插件、分页插件的原理等六个方面展开…

SharePoint 2013 处理videoplayerpage.aspx下的个人图片显示有误问题

问题&#xff1a;Personal sites photo cant correct display in the videos pageThe url address of personal sites photo is exist surplus characters. The correct situation is just the characters of "%20", not the characters of "%2520".解决方…

clover引导mbr安装黑苹果_安装黑苹果记录(一)

从来没有接触过macOS(苹果系统)&#xff0c;孩子说他用的那台电脑linux不能安装一些软件&#xff0c;问我能不能安装黑苹果&#xff0c;一些软件只有win和mac的客户端&#xff0c;却没有linux版本。他知道我不会给他安装Windows&#xff0c;一个是怕他玩游戏&#xff0c;另外一…

doxygen问题集锦

使用doxygen排版数学公式出错的解决方法 参考&#xff1a;http://blog.csdn.net/huangbo10/article/details/46801949 问题 今天玩了一下doxygen&#xff0c;碰到一个问题 ! Undefined control sequence. l.77 $ y_{\mbox{test}} \mathbb{E}[y_{\mbox{train}}] x $ ? !…

ubuntu中make头文件找不到_和平精英:游戏中找不到人怎么办?这些技巧帮你练出“火眼金睛”...

大家好&#xff0c;欢迎来到《刺激实战教室》&#xff0c;我是你们的老朋友刺激哥。俗话说&#xff0c;电子竞技不需要视力&#xff0c;而这句话也是《和平精英》的一个“痛点”。在《和平精英》这款游戏中&#xff0c;更是如此。在很多时候&#xff0c;敌人就藏在我们的附近&a…

eureka配置_F版本SpringCloud 5—Eureka集群和自我保护机制

源码地址&#xff1a;https://gitee.com/bingqilinpeishenme/Java-Tutorials前言上篇文章中&#xff0c;通过代码搭建了Eureka注册中心和客户端&#xff0c;是Eureka的简单应用&#xff0c;在本文中将会讲解更多关于Eureka服务端的应用以及原理。Eureka 自我保护机制进入自我保…

windows共享内存

在windows编程中避免不了使用共享内存&#xff0c;因为他是进程间通信、文件读取最简单的方式&#xff0c;有书上还说其他进程间通讯机制如管、油槽、WM_COPYDATA底层也是用的共享内存机制。关于使用方法还是请参考MSDN。 最近听说使用共享内存不安全&#xff0c;可能会被其他进…

Chrome指令/追踪Http请求相关

2019独角兽企业重金招聘Python工程师标准>>> Chrome HTTP抓包&#xff0c;在地址栏输入 chrome://net-internals/#requests转载于:https://my.oschina.net/u/2292141/blog/895603

离散卷积与自相关

本文章转载自&#xff1a;http://www.cnblogs.com/einyboy/archive/2012/12/30/2839633.html 一、 定义 离散信号f(n),g(n)的定义如下&#xff1a; N-----为信号f(n)的长度 s(n)----为卷积结果序列,长度为len(f(n))len(g(n))-1 例&#xff1a; f(n) [1 2 3]; g(n) [2 3 1]; …

excel打开后灰色不显示内容_Excel二维表转换,一分钟就够

点击蓝字关注我们44个Excel 使用技巧基本方法作为职场人&#xff0c;加班累如狗。如何更轻松的工作并获得喜人的报酬便是咱们职场人一直追求的“生活哲理”&#xff0c;说到Excel,对于办公室群体而言实在是太常见不过了&#xff0c;不管做什么&#xff0c;咱们都会跟它打交道&a…

卷积的循环矩阵求解方法

通常我们求解一维卷积或者二维卷积都是采用模板平移的方法&#xff0c;今天我们介绍一种新的求解方法&#xff0c;可以一次性求出所有的结果。 一维卷积 卷积定义 对于两个长度分别为m和n的序列x(i)和g(i)有&#xff0c; h(i)x(i)∗g(i)∑jx(j)g(i−j)h(i)=x(i)*g(i)=\sum_…