算法導論+編程之美,查找數組中最大值和最小值

查找數組中最大值和最小值,


方法一:分治法,一分爲二,分別查找子數組中最大值和最小值,合併時取兩個子數組的較大者和較小者。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;
    }

}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章