您的位置:首页 > 其它

分治法求最大最小元素

2012-05-06 23:11 232 查看
问题:在含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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐