分治算法-----二分求最大最小

Posted jr-ag

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治算法-----二分求最大最小相关的知识,希望对你有一定的参考价值。

例题1:给n个实数,求它们之中最大值和最小值,要求比较次数尽量小。

思路:用递归调用函数,在函数里做出以下判断:

1 若left==right(只有一个数) max和min都为这个数

2 若left==right-1(只有两个数) max为较大的,min为较小的

3 除以上两种以外 首先定义中间值d,在递归调用left到d与d+1到right的函数,max为两函数返回值的最大值,min为最小值

核心思路如上

原代码:

#include <iostream>
using namespace std;
int a[132133],maxx,minn;
void qq(int left1,int right1,int &maxx,int &minn)
{
int d=0,max1=0,max2=0,min1=0,min2=0;
if(left1==right1){
maxx=a[left1];
minn=a[left1];
}
if(right1==left1+1){
maxx=max(a[left1],a[right1]);
minn=min(a[left1],a[right1]);
}
else{
d=(left1+right1)/2;
qq(left1,d,max1,min1);
qq(d+1,right1,max2,min2);
maxx=max(max1,max2);
minn=min(min1,min2);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
qq(1,n,maxx,minn);
cout<<maxx<<" "<<minn;
return 0;
}

错误原因:思路没错,但11行的if前面没有else,导致15行的else只建立在11行的if上,与思路不符,把if前面填个else即可

以上是关于分治算法-----二分求最大最小的主要内容,如果未能解决你的问题,请参考以下文章

分治算法总结(未完结)

转:算法分析之 五大常用算法

分治法求最大最小

用C语言和分治算法 求最近的两点的距离~

分治算法 ------最大最小值小结

HNUCM-1435 最大最小值(分治法)