[算法设计与分析]4.3.2典型二分法(金块问题)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pecony/article/details/80024894
#include<stdio.h>
#include<iostream>

using namespace std;
void GoldBrick(int a[], int i, int j, int & fmax, int & fmin);

int main ()
{
    int i = 0;
    int j = 4;
    int fmax, fmin;
    int a[j - i + 1] = {1, 3, 5, 2, 4};
    GoldBrick(a, i, j, fmax, fmin);
    cout << "max=" << fmax << endl <<"min=" << fmin << endl;
}

void GoldBrick(int a[], int i, int j, int & fmax, int & fmin)
{
    int mid;
    int lmax, lmin, rmax, rmin;
//递归终止条件 
    if(i == j)//i=j 只传入一个数 
    {
        fmax = a[i];
        fmin = a[i];
    }
    else if(i == j - 1)//传入两个数
    {
        fmax = a[i] > a[j] ? a[i] : a[j];
        fmin = a[i] < a[j] ? a[i] : a[j];
    }
    else
    {
        mid = (i + j) / 2;
        GoldBrick(a, i, mid, lmax, lmin);//类似于二分法
        GoldBrick(a, mid + 1, j, rmax, rmin);
        
        fmax = lmax > rmax ? lmax : rmax;//递归结束后逐层返回 并逐次将最小值和最大值集中到fmax和fmin上
        fmin = lmin < rmin ? lmin : rmin;
    }
}

猜你喜欢

转载自blog.csdn.net/Pecony/article/details/80024894