分治算法求最大最小值
首先我们为什么要用分治算法来求最大最小值,用循环比较一个个来不好吗,你去上学走路能到学校,骑自行车也能到学校,可你为什么要骑自行车去呢,不就是为了节省时间嘛,使用分治算法同样是这样的,下面给大家普及一下分治算法思想:
分治算法思想:
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。
接下里我们将用一个本例题给大家说明分治算法的简单思想,上面我们说到,分治算法就是将一个为n的问题分解为k个规模较小的子问题,就像此题,我们将数组中的一串数字分解为n/2
,n/2
的子问题,直到n/2
中的元素<=2
停止,使用递归求出每一个子问题的解,最大值最小值,而且每一个子问题的解都是独立并且与原问题性质相同。 然后将每一个子问题的解比较整合就是原问题的解了。
算法步骤:
算法复杂度:
讲清了上面的原理,下面直接来看代码,如下:代码片
#include<stdio.h>
void maxmin(float a[],int i,int j,float *fmax,float *fmin) {
int mid;
float lmax,lmin,rmax,rmin;
if(i==j) {
*fmax=a[i];
*fmin=a[j];
return;
} else if(i==j-1) {
if(a[i]>a[j]) {
*fmax=a[i];
*fmin=a[j];
} else {
*fmax=a[j];
*fmin=a[i];
}
return ;
} else {
mid=(i+j)/2;
maxmin(a,i,mid,&lmax,&lmin);
maxmin(a,mid+1,j,&rmax,&rmin);
if(lmax>rmax)
*fmax=lmax;
else
*fmax=rmax;
if(lmin<rmin)
*fmin=lmin;
else
*fmin=rmin;
}
return ;
}
int main() {
int n;
float a[100];
float fmax,fmin;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%f",&a[i]);
maxmin(a,0,n-1,&fmax,&fmin);
printf("%0.1f %0.1f",fmax,fmin);
}
运行结果如下:
最大值32,最小值2,我们这里采用的浮点型数据,主要为了应付输入时会输入小数点数字。最后来个小结,如果你看到我这篇文章,觉得有什么错误或者争议的地方,欢迎留言评论。