一个简单的分治算法(求最大最小值)

分治算法求最大最小值

     首先我们为什么要用分治算法来求最大最小值,用循环比较一个个来不好吗,你去上学走路能到学校,骑自行车也能到学校,可你为什么要骑自行车去呢,不就是为了节省时间嘛,使用分治算法同样是这样的,下面给大家普及一下分治算法思想:


分治算法思想:
     分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。


接下里我们将用一个本例题给大家说明分治算法的简单思想,上面我们说到,分治算法就是将一个为n的问题分解为k个规模较小的子问题,就像此题,我们将数组中的一串数字分解为n/2n/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,我们这里采用的浮点型数据,主要为了应付输入时会输入小数点数字。最后来个小结,如果你看到我这篇文章,觉得有什么错误或者争议的地方,欢迎留言评论。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mjh1667002013/article/details/112723789
今日推荐