代码改变世界

分治法求最大最小元素

2012-05-06 23:11  youxin  阅读(1776)  评论(0编辑  收藏  举报

   问题:在含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;
}