采用分治法求一个整数序列中的最大和最小元素

执行代码:

#include <stdio.h>

int max(int x,int y){
	if(x>y)
		return x;
	else
		return y;
}
int min(int x,int y){
	if(x<y)
		return x;
	else
		return y;
}

void MaxMin(int a[], int l, int r, int &maxe, int &mine){
	int mid;
	if(l == r){  //只有一个元素
		maxe = a[l];
		mine = a[l]; 
	}
	else if(l == r -1){  //只有两个元素
		maxe = max(a[l], a[r]); 
		mine = min(a[l], a[r]);
	} 
	else{  //有两个以上元素
		mid = (l + r) / 2;
		int lmaxe, lmine;
		MaxMin(a, l, mid, lmaxe, lmine);
		int rmaxe, rmine;
		MaxMin(a, mid + 1, r, rmaxe, rmine);
		maxe = max(lmaxe, rmaxe);
		mine = min(lmine, rmine); 
	}
}

int main(){
	int a[] = {4, 3, 1, 2, 5,10};
	int n = sizeof(a) / sizeof(a[0]);
	int maxe, mine;
	MaxMin(a, 0, n -1, maxe, mine);
	printf("最大值为:%d\n",maxe); 
	printf("最小值为:%d\n",mine); 
	return 0;
}

运行结果:
在这里插入图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
一、本书的内容 目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性规划,以及对第1版详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书引入了“循环不变式”,并贯穿始终地用来证明算法的正确性。在不改动数学和分析重点的前提下,作者将第1版的许多数学基础知识从第一部分移到了附录。 二、本书的特点 本书在进行算法分析的过程,保持了很好的数学严谨性。书的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书,作者将算法的讨论集在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算法领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算法,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方法。 本书以相当的深度介绍了许多常用的数据结构和有效的算法。编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书算法均以通俗易懂的语言进行说明,并采用了大量插图来说明算法是如何工作的,易于理解。 4.算法的“伪代码”形式简明实用。 书算法均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算法设计的效率,对所有的算法进行了仔细、精确的运行时间分析,有利于进一步改进算法。 三、本书的用法 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算法的人,也可以在本书找到所需的材料。 每一章都是独立的,读者只需将注意力集到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算法研究的一个全面、综合性的介绍。书给出了多个算法,并对它们进行了较为深入的分析,使得这些算法设计和分析易于被各个层次的读者所理解。力在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书讨论了算法设计的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些
### 回答1: 这是一个很简单的算法,可以采用分治法来实现。首先,将整数序列平均分成两半,然后分别出这两半的最大最小元素。接下来,将这两半的最大最小元素比较,得到整个序列最大最小元素。 具体步骤如下: 1. 如果序列长度为1,那么直接返回该元素,因为它是序列最大最小元素。 2. 如果序列长度为2,那么比较两个元素,得到最大最小元素。 3. 如果序列长度大于2,那么分别出左半部分和右半部分的最大最小元素,然后比较得到整个序列最大最小元素。 代码实现如下: ``` int findMaxAndMin(int arr[], int l, int r) { if (l == r) { return arr[l]; } if (r == l + 1) { return max(arr[l], arr[r]); } int mid = (l + r) / 2; int leftMax = findMaxAndMin(arr, l, mid); int rightMax = findMaxAndMin(arr, mid + 1, r); return max(leftMax, rightMax); } ``` 这个算法的时间复杂度为O(nlogn),因为每次分治都会将序列长度减半,因此最多进行logn次分治。 ### 回答2: 分治法是一种常用的算法设计思想,其基本思路是将问题分解为若干个规模较小,相互独立且与原问题结构相似的子问题,通过解决子问题来解决原问题。在一个整数序列最大最小元素时,也可以采用分治法。 首先,我们需要将整数序列间位置划分为两个子序列,并分别出这两个子序列最大最小元素。这可以使用递归算法来实现,直到序列的长度为1,即解单个元素最大值和最小值。 然后,我们需要将两个子序列最大值和最小值合并。我们可以同时记录两个变量,一个用于记录当前的最大值,另一个用于记录当前的最小值,然后比较每个子序列最大值和最小值,更新这两个变量的值。 最后,我们将这两个变量作为结果返回即可。如果序列长度为奇数,则最大值和最小值一定在同一个序列,我们只需要返回其一个序列最大值和最小值即可;如果序列长度为偶数,则最大值和最小值可能分别在两个子序列,我们需要比较两个子序列最大值和最小值,返回其较大和较小的值。 总的来说,一个整数序列最大最小元素分治法算法步骤如下: 1. 将序列间位置划分为两个子序列,并分别出这两个子序列最大值和最小值(递归实现)。 2. 将两个子序列最大值和最小值合并,更新当前的最大值和最小值。 3. 如果序列长度为奇数,则返回其一个序列最大值和最小值;如果序列长度为偶数,则返回其较大和较小的值。 ### 回答3: 对于这道题目,我们可以采用分治算法的思想来解决。分治算法是一种将问题分成多个子问题来解决的算法模式。它通常用递归来实现,每个子问题都和原问题具有相同的结构,并且是独立的。最终的结果是所有的子问题的结果的组合。 具体的实现:我们将整个序列分成两个部分,左区间和右区间。对于每个区间,我们分别最大最小元素,再将结果组合起来,就可以得到整个序列最大最小元素。具体步骤如下: 1. 先确定序列心点m,将序列分成左区间和右区间。 2. 对于左区间和右区间,分别递归地调用最大最小元素的函数,获得两个区间的最大最小值。 3. 最后,在得到左区间和右区间的最大最小值后,将其组合起来,得到整个序列最大最小元素。 分治算法的时间复杂度为O(nlogn) ,因为我们每次将序列分成两个区间,所以递归的层数为log(n),每层分治算法所需的时间为O(n),所以总时间复杂度为O(nlogn)。 使用分治算法序列最大最小元素的优点在于可以提高计算效率,当序列规模非常大时,分治算法可以非常快速地最大最小值,而且复杂度非常稳定,不会受到序列初始状态的影响。 但分治算法对实现的技巧要较高,需要设计好递归函数,并且需要合理地处理边界情况。对于大规模数据的运算来说,分治算法可能比暴力算法有高效的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wxlo0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值