分治法搜索数组中最大值(最小值)

分治法

1、将问题"分割"成局部问题;
2、递归求局部问题
3、将局部问题的解"整合",解决原问题

//分治法找最大元素模板题(最小)
#include <bits/stdc++.h>
using namespace std;

/*大白2书上p110有问题:
	int fmax(int a[],int l,int r){
	int mid=(l+r)/2;
	if(l==r-1)return a[l];

	int u=fmax(a,l,mid);
	int v=fmax(a,mid,r);

	int x=max(u,v);
	return x;
}*/ /*案例:1 2 3 4 5  输出:4 */

int fmax(int a[],int l,int r){
	int mid=(l+r)/2;
	if(l==r||l==r-1)return max(a[l],a[r]);

	return max(fmax(a,l,mid),fmax(a,mid+1,r));
	/*优化以下代码如上
	int u=fmax(a,l,mid);
	int v=fmax(a,mid+1,r);
	int x=max(u,v);
	return x;*/
}/*案例:1 2 3 4 5  输出:5*/

int main(){
	int a[5];
	for(int i=0;i<5;i++)cin>>a[i];
	cout<<fmax(a,0,4);
	return 0;
}

/*推算过程 案例:1 2 3 4 5

f(a,0,4)-> m=2;u=f(a,0,2);v=f(a,3,4)=max(a[3],a[4])=5;x=max(u,v);return x;

f(a,0,2)-> m=1;u=f(a,0,1)=a[1]=2;v=f(a,2,2)=a[2]=3;x=3;return 3;

 故:总return 5;
*/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
分治法是一种解决问题的思想,它将问题分解成若干个小的问题,然后递归求解这些小问题,最终将这些小问题的结果合并起来得到原问题的解。对于求解数组最大值最小值,可以采用分治法来实现。 具体实现思路如下: 1. 将数组分成两部分,分别求出左半部分的最大值最小值,以及右半部分的最大值最小值。 2. 将左半部分的最大值和右半部分的最大值进行比较,取其中较大的一个作为数组最大值。 3. 将左半部分的最小值和右半部分的最小值进行比较,取其中较小的一个作为数组最小值。 4. 返回最大值最小值。 代码实现如下: ```python def find_max_min(arr, left, right): # 如果数组只有一个元素,直接返回该元素作为最大值最小值 if left == right: return arr[left], arr[left] # 如果数组只有两个元素,比较它们的大小并返回最大值最小值 if left + 1 == right: if arr[left] > arr[right]: return arr[left], arr[right] else: return arr[right], arr[left] # 如果数组有多个元素,将数组分成两部分,分别求出左半部分和右半部分的最大值最小值 mid = (left + right) // 2 left_max, left_min = find_max_min(arr, left, mid) right_max, right_min = find_max_min(arr, mid+1, right) # 比较左半部分的最大值和右半部分的最大值,取其中较大的一个作为数组最大值 if left_max > right_max: max_val = left_max else: max_val = right_max # 比较左半部分的最小值和右半部分的最小值,取其中较小的一个作为数组最小值 if left_min < right_min: min_val = left_min else: min_val = right_min return max_val, min_val ``` 调用函数: ```python arr = [5, 3, 8, 2, 9, 1] max_val, min_val = find_max_min(arr, 0, len(arr)-1) print("最大值为:", max_val) print("最小值为:", min_val) ``` 输出结果: ``` 最大值为: 9 最小值为: 1 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值