您的位置:首页 > 其它

寻找数组中的最大值和最小值

2013-02-25 15:05 218 查看
  分治算法,在N个数中求最大值和最小值,我们只需求出前后N/2个数的Min和Max,然后取较小的Min,较大的Max即可 

按顺序将数组中相邻的两个数分在同一组,然后利用两个变量Max 和 Min存储当前的最大值和最小值。

#include<iostream>
using namespace std;

class MaxMin
{
public:
int max;
int min;
MaxMin(int max,int min):max(max),min(min){}
MaxMin(){}
};

MaxMin maxmin(int *arr,int low,int high)
{
int i=low ;
int j=high ;
if(i<=j)
{
if(i==j-1)
{
if(arr[i]<arr[j])
return MaxMin(arr[j],arr[i]);
else
return MaxMin(arr[i],arr[j]);
}
if(i==j)
return MaxMin(arr[j],arr[i]);

MaxMin res;
int mid=(i+j)>>1;
MaxMin left=maxmin(arr,low,mid);
MaxMin right=maxmin(arr,mid+1,high);

if(left.max>right.max)
res.max=left.max;
else
res.max=right.max;

if(left.min>right.min)
res.min=right.min;
else
res.min=left.min;

return res;
}
}

int main()
{
int arr[]={7,5,8,1,9,4};
//int arr[]={7,5};
MaxMin res1=maxmin(arr,0,5) ;
cout<<res1.max<<" "<<res1.min<<endl ;
return 0;
}

扩展题目
找出N个数组中第二大的数,需要比较多少次呢?

我们也可以在数组中,两数结合,分别求出最大值 和 次大值,之后每两个数结合求出的最值 在相互比较,得到最值得最大值 和 次大值
具体思路:
把数组中的每两个元素分为一组,每组中的最大数为F,第二大数为S。
假设相邻两组的最大数和第二大数分别是:Fleft,Si 和 Fright,Sj,。
则这两组合并为一组后,其中最大数和第二大数可能是:
1、若Fi > Fj,则最大数是Fi;

      若Si >Fj,则第二大数是Si;否则,第二大数是Fj

2、若Fi< Fj,则最大数是Fj

      若Fi>Sj,则第二大数是Fi;否则,第二大数是Sj

比较次数:共有N/2组,每组需要比较倆次得出本组的最大数和第二大数;共需比较N/2 * 2次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: