标签:std 结束 开始 复杂 dac using oid 分治法 递归
分治法:将一个复杂的一分为二,然后对这两部分递归调用该函数,直到找到函数出口,求解出最简单的情况
需要注意的是分治时开始和结束位置参数的选择,一开始写的是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;
}
标签:std 结束 开始 复杂 dac using oid 分治法 递归
原文地址:https://www.cnblogs.com/wuhenxiansen/p/10589907.html