天天看點

求整型數組的最大值、最小值、極大值、極小值

算法分析

1.貪心

2.switch狀态機

圖解

求整型數組的最大值、最小值、極大值、極小值

代碼

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int N;
    int a[100];
    static const int BEGIN = 0;
    static const int UP = 1;
    static const int DOWN = 2;  //BEGIN UP DOWN 對應數值變化的三種狀态
    int STATER = BEGIN;
    int maximumNUM = 0;
    int minimumNUM = 0;  
    int i;
    int b[50],c[50];
    printf("請輸入數組個數:");
    scanf("%d",&N);
    printf("請輸入數組元素:");
    for(i = 0; i < N;i++){
        cin >> a[i];
        
    }
    for(int i = 1;i < N;i++){
        switch (STATER)
        {
        case BEGIN:                 
            if(a[i-1]<a[i]){
                STATER = UP;
            }else if(a[i-1]>a[i]){
                STATER = DOWN;
            }
            break;
        case UP:                //已知a[i-1]是升序得到,若a[i]>a[i-1],則為遞增,不是極值
            if(a[i-1]>a[i]){
                STATER = DOWN;  //尋找折點
                b[maximumNUM] = a[i-1];
                maximumNUM++;
            }
            break;
        case DOWN:
            if(a[i-1]<a[i]){
                STATER = UP;
                c[minimumNUM] = a[i-1];
                minimumNUM++;
            }
            break;
        }
    }
    printf("極大元個數:%d\n",maximumNUM);
    printf("極大元為:");
    for(i=0;i<maximumNUM;i++){
        cout << b[i]<<" ";
    }
    cout<<endl;
    cout <<"----------------"<<endl;
    printf("極小元個數:%d\n",minimumNUM);
     printf("極小元為:");
    for(i=0;i<minimumNUM;i++){
        cout << c[i]<<" ";
    }
    cout<<endl;
   cout <<"----------------"<<endl;
    sort(a,a+N);
    printf("最小值:%d\n",a[0]);
    printf("最大值:%d\n",a[N-1]);
    system("pause");

}