问题:
从一数组中同时取出最大值和最小值
解析:
这问题较为简单,可用打擂台方法来求算,在这里我运用分治法来算。
分治法回顾:
1.审题:判断题目能不能划分成多个可独立解决的子问题
2.分解:找到分解的技巧与界限,通常需要利用递归分解
3.合并:这个需要具体问题具体分析,在这里我们需要将左子数组和右子数组的最值进行判断,保留其中更大或更小的最值即可
函数处理:
但是在C或C++中,如果将算法封装在函数里,会出现一个问题是“如何在函数里同时取得两个值?”,众所周知函数只能返回一个值,那怎么办呢?
有几个方法:
1.设定全局变量
2.传参时用引用参数
为了避免函数只能返回一个值的尴尬,那么干脆不要让函数返回值了,借助引用传参巧妙达到“返回”两个值的目标,也就是void
解决代码:
#include<iostream>
using namespace std;
int a[10];
void maxmin(int i,int j,int &fmax,int &fmin);
int main(){
int fmin,fmax;
for(int i=0;i<10;i++){
cin>>a[i];
}
maxmin(0,9,fmax,fmin);
cout<<fmax<<' '<<fmin;
}
void maxmin(int i,int j,int &fmax,int &fmin){ //引用传参
int mid,lmin,lmax,rmin,rmax;
if(i==j){ //数组中只有一个值
fmax=a[i];
fmin=a[i];
} else if(i==j-1) {
if(a[i]<=a[j]){
fmax=a[j];
fmin=a[i];
}
} else { //数组里有两个值
mid=(i+j)/2;
maxmin(i,mid,lmax,lmin);
maxmin(mid+1,j,rmax,rmin);
if(lmax>rmax){ //合并的体现之处
fmax=lmax;
} else {
fmax=rmax;
}
if(lmin>rmin) {
fmin=rmin;
} else {
fmin=lmin;
}
}
}