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