给定一个数组,求数组中的最大元和最小元(即最大值和最小值)
法1:直接求解
#include<iostream>
using namespace std;
int main(){
int n,a[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int max=a[0],min=a[0];
for(int i=1;i<n;i++){
if(a[i]<min)
min=a[i];
if(a[i]>max)
max=a[i];
}
cout<<max<<" "<<min;
}
法二:分治法
将数组一分为二,先求解左边的最大元和最小元,再求解右边的最大元和最小元,然后左边的最大元,右边的最大元,取最大即为整体的最大元;最小元同理。
/*
法2:分治法
*/
void max_min(int a[],int l,int r,int &max,int &min){
int n=r-l+1;
int p=n/2;
if(n==1){//只有一个元素
max=a[l];
min=a[l];
}
else if(n==2){//只有两个元素
max=a[l]>a[r]?a[l]:a[r];
min=a[l]<a[r]?a[l]:a[r];
}
else{//有大于两个元素时
int lmax,lmin,rmax,rmin;//左边最大元、最小元、右边最大元、最小元
max_min(a,l,p,lmax,lmin);//求左边的最大元和最小元
max_min(a,p+1,r,rmax,rmin);//求右边的最大元和最小元
max=lmax>rmax?lmax:rmax;
min=lmin<rmin?lmin:rmin;
}
}
//测试
int main(){
int n,a[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int max,min;
max_min(a,0,n-1,max,min);
cout<<max<<" "<<min;
return 0;
}