问题:在含n个元素的集合中寻找最大值和最小值。
最常见的做法是:
max=a[1]; min=a[1]; for(i=2;i<=n;i++) if(max<a[i]) max=a[i];
else if(min>a[i]) min=a[i];
算法中需要比较N-1次,才能得到max,最好的情况是升序,不需要进行与min的比较, 共进行n-1次比较。
最坏的情况是降序,要经过n-1次比较得到Min,共进行2*n-2次比较,至于在平均情况下,为3(n-1)/2;
用分治法可以用较少的次数解决上述问题。
1,将数据等分为2组,目的是分别选取其中的最大值和最小值
2,递归分解直到每组元素的个数<=2;可简单的找到最大最小值
3.回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,既合并为当前问题的解。
#include<iostream> #include<minmax.h> using namespace std; void maxmin(int a[],int &e_max,int &e_min,int low,int high) { int mid,x1,y1,x2,y2; if((high-low)<=1) //若相等,high=low,最大最小都是这个数,可以把这个写出2个 { if(a[high]>a[low]) { e_max=a[high]; e_min=a[low]; } else { e_max=a[low]; e_min=a[high]; } } else { mid=(low+high)/2; maxmin(a,x1,y1,low,mid); maxmin(a,x2,y2,mid+1,high); e_max=max(x1,x2); e_min=min(y1,y2); } } int main() { int a[]={8,3,6,2,1,9,4,5,7};//9个元素 int low=0; int high=8; int e_max,e_min; maxmin(a,e_max,e_min,low,high); cout<<e_max<<ends<<e_min<<endl; }