查找數組中最大值和最小值,
方法一:分治法,一分爲二,分別查找子數組中最大值和最小值,合併時取兩個子數組的較大者和較小者。f(n) = 2f(n-1)+2;f(n)=1.5n-2;
方法二:將數組中元素每兩個一組,先比較每組中兩個元素,讓較大者與最大值比較,較小者與最小值比較,每組比較3次,共需比較次數爲1+1.5(n-2)=1.5n-2;
從空間角度看,非遞歸的方法二更簡單;
#include <iostream>
using namespace std;
void FindMaxAndMin(int num[],int l,int r,int &minNum,int &maxNum);
void FindMaxAndMin2(int num[],int n,int &minNum,int &maxNum);
int main()
{
int n = 6;
int num[] = {6,5,8,3,9,7};
int minNum,maxNum;
FindMaxAndMin(num,0,n-1,minNum,maxNum);
for(int i=0 ; i<n ; i++){
cout << num[i] << " ";
}
cout << endl;
cout << minNum << " " <<maxNum<< endl;
FindMaxAndMin2(num,n,minNum,maxNum);
cout << minNum << " " <<maxNum<< endl;
return 0;
}
void FindMaxAndMin2(int num[],int n,int &minNum,int &maxNum)
{
int i = 0;
if(n <= 0){
minNum = -1;
maxNum = -1;
return ;
}
if(n%2 == 1){//奇數個數
minNum = num[0];
maxNum = num[0];
i = 1;
}
else{//偶數個數
if(num[0] > num[1]){
maxNum = num[0];
minNum = num[1];
}
else{
maxNum = num[1];
minNum = num[0];
}
i = 2;
}
for( ; i<n ; i+=2){
if(num[i]>num[i+1]){
if(maxNum < num[i]){
maxNum = num[i];
}
if(minNum > num[i+1]){
minNum = num[i+1];
}
}
}
}
void FindMaxAndMin(int num[],int l,int r,int &minNum,int &maxNum)
{
int minl,maxl,minr,maxr;
if(r - l == 0){
minNum = num[r];
maxNum = num[r];
return ;
}
if(r - l == 1){
if(num[r] > num[l]){
maxNum = num[r];
minNum = num[l];
}
else{
maxNum = num[l];
minNum = num[r];
}
return ;
}
FindMaxAndMin(num,l,(l+r)/2,minl,maxl);
FindMaxAndMin(num,1+(l+r)/2,r,minr,maxr);
//merge
if(minl < minr){
minNum = minl;
}
else{
minNum = minr;
}
if(maxl > maxr){
maxNum = maxl;
}
else{
maxNum = maxr;
}
}