算法导论+编程之美,查找数组中最大值和最小值

来源:互联网 发布:网络造谣是什么罪 编辑:程序博客网 时间:2024/05/17 02:46

查找数组中最大值和最小值,


方法一:分治法,一分为二,分别查找子数组中最大值和最小值,合并时取两个子数组的较大者和较小者。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;    }}





0 0