如果单独求数组的最大值或者最小值,那么必须要做n-1次比较。
以下就以求最小值为例来说明,详细代码如下(talk is cheap, show me the code):
int minimum( vector<int>& vec )
{
int size = vec.size();
if ( size == 0 )
{
return -1;
}
else
{
int MIN = vec[0];
for ( int i = 1; i < size; i++ )
{
MIN = min(MIN, vec[i]);
}
return MIN;
}
}
那么是否同时求一个数组最大值的时候最优解就是进行2*(n-1)次比较操作???
实际上有更好的解法,将数组两个数一对,每对每对的比较。首先每对内部可以比较出大小,将大的和数组剩下的每对中较大的比较,这样就可以求出最大值。类似的可以求出最小值。
code 如下:
/// 这里首先不考虑数组长度小于2的情况;
vector<int> max_min( vector<int>& vec )
{
int size = vec.size();
int Max = 0;
int Min = 0;
if ( vec[0] >= vec[1] )
{
Max = vec[0];
Min = vec[1];
}
else
{
Max = vec[1];
Min = vec[0];
}
for ( int i = 1; i < (n-1)/2; i++ )
{
if ( vec[2*i] >= vec[2*i+1] )
{
if ( vec[2*i] >= Max )
{
Max = vec[2*i];
}
if ( vec[2*i+1] <= Min )
{
Min = vec[2*i+1];
}
}
else
{
if ( vec[2*i+1] >= Max )
{
Max = vec[2*i+1];
}
if ( vec[2*i] <= Min )
{
Min = vec[2*i];
}
}
}
vector<int> result;
result.push_back(Max);
result.push_back(Min);
return result;
}