方法一:蛮力法
/**用最少的比较次数找出一袋金块中最重的和最轻的**/
/**蛮力法,相当于一次排序*/
#include<iostream>
using namespace std;
int main(){
int a[5];//为了输入的时候省事才弄这么小的
for(int i=0;i<5;i++){
cin>>a[i];
}
int max1=a[0],min1=a[0];
for(int j=0;j<5;j++){
if(a[j]>max1){
max1=a[j];
}else if(a[j]<min1){
min1=a[j];
}
}
cout<<"max="<<max1<<"min="<<min1<<endl;
}
方法二:二分法
/**二分法*/
int a[9]={1,9,5,8,6,3,2,4,7};
int maxmin(int i,int j,float &fmax,float &fmin){
float lmin,lmax,rmin,rmax,mid;
if(i==j){
fmax=a[i];
fmin=a[i];
}
else if(j-i==1){
fmax=(a[i]>a[j])?a[i]:a[j];
fmin=(a[i]<a[j])?a[i]:a[j];
}
else {
mid=(i+j)/2;
maxmin(i,mid,lmax,lmin);
maxmin(mid,j,rmax,rmin);
fmax=(lmax>rmax)?lmax:rmax;
fmin=(lmin<rmin)?lmin:rmin;
}
}
int main(){
float _max,_min;
maxmin(0,8,_max,_min);
cout<<_max<<" "<<_min;
}
解释:把数据分成两组,可能是一组比另一组多一个数,没关系,就比较出组内最大值和组内最小值就好,然后再将其分成两组,找最大最小值,直到只剩下一个数或者两个数,只剩一个就说明他自己就是最大或者最小,剩两个下来就比较大小,大的就是最大的小的就是最小的,然后回溯,子数组中大的给fmax,就是最终的最大值,子数组中的最小的给fmin,最终的最小值