寻找数组中的最大值和最小值
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次。
按顺序将数组中相邻的两个数分在同一组,然后利用两个变量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次。
相关文章推荐
- 寻找数组中的最大值和最小值
- 剑指offer中取双元素法寻找数组中的最小值和最大值中的bug
- 读书笔记之编程之美 - 2.10 寻找数组中的最大值和最小值
- 寻找数组中的最大值和最小值
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- 【编程之美】读书笔记:寻找数组中的最大值和最小值
- 编程之美寻找数组中的最大值和最小值以及扩展问题
- 编程之美_2.10_寻找数组中的最大值和最小值
- 同时寻找一个数组中的最大元素和最小元素--你会有所收获
- 编程之美2.10寻找数组中的最大值和最小值代码
- 寻找数组中的最大值和最小值
- 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
- 寻找数组中的最大值和最小值(编程之美2.10,包括最大值和次大值)
- 如何寻找数组中的最小值和最大值
- 寻找数组N中最大(最小的)M个数(亲自调试可运行)
- 寻找数组中的最大值和最小值
- 第2章 数字之魅——寻找数组中的最大值和最小值
- 编程之美 set 5 寻找数组中最大值和最小值
- 寻找数组中的最大值和最小值(编程之美2.10,包括最大值和次大值)
- 每日一题(22) - 寻找数组中的最大值和最小值