最大元和最小元(直接求解法和分治法)

給定一個數組,求數組中的最大元和最小元(即最大值和最小值)

法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;
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章