分治法求一个数组中最大最小值

分治法:将一个复杂的一分为二,然后对这两部分递归调用该函数,直到找到函数出口,求解出最简单的情况

需要注意的是分治时开始和结束位置参数的选择,一开始写的是s到mid-1,另一个是mid到e,然后就会数组为奇数个时结果对,为偶数个时结果错,后面改为s到mid,另一个是mid+1到e 结果就对了。

#include<iostream>
using namespace std;
#define N 10
#define MAX(a,b)(a>b?a:b)
#define MIN(a,b)(a<b?a:b)
/*分治法 */
void DACM(int *a,int s,int e,int &max,int &min)//调用引用的用于接收最大最小值
{
    int Lmin,Lmax,Rmin,Rmax;
    if(s==e)
    {
        max=*(a+s);
        min=*(a+s);
        return ;
    }
    if((e-s)==1)
    {
        max=MAX(*(a+s),*(a+e));
        min=MIN(*(a+s),*(a+e));
        return ;
    }
    int mid=(s+e)/2;
    DACM(a,s,mid,Lmax,Lmin);
    DACM(a,mid+1,e,Rmax,Rmin);
    if(Lmax>Rmax)
    {
        max=Lmax;
        cout<<"max="<<max<<endl;//查看当前最大值
    }
    else
    {
        max=Rmax;
        cout<<"max="<<max<<endl;
    }
    if(Lmin<min)
    {
        min=Rmin;
        cout<<"min="<<min<<endl;//查看当前最小值
    }
    else
    {
        min=Lmin;
        cout<<"min="<<min<<endl;
    }
    return ;
}
int main()
{
    int max,min;
    int a[N]={5,0,1,2,3,7,8,4,6,9};
    DACM(a,0,N-1,max,min);
    cout<<"最大值"<<max<<"最小值"<<min<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wuhenxiansen/p/10589907.html