給定一個數組,求數組中的最大元和最小元(即最大值和最小值)
法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;
}