废话不说,直接上《算法导论》上的话。
将一对输入元素相互进行比较,然后把较小的与当前的最小值进行比较,把较大值与当前的最大值进行比较。
如果n是奇数,那么总共进行了 3*floor(n/2)次比较。如果n是偶数,则是先进行一次初始比较,然后进行3*(n-2)/2 次比较。因此,不管哪一种情况,总的比较次数至多是 3*floor(n/2)。
上代码:
#include<vector>
#include<iostream>
using namespace std;
void show_vec(vector<int> vec)
{
cout<<endl;
for(int i=0;i<vec.size();i++)
cout<<vec[i]<<" ";
cout<<endl;
}
void find_max_min(vector<int> &vec,int *p_max,int *p_min)
{
int max=vec[0],min=vec[0];
if(vec.size()%2==0)
{
for(int i=0;i<vec.size();i=i+2)
{
if(vec[i]>vec[i+1])
{
if(max<vec[i])
max=vec[i];
if(min>vec[i+1])
min=vec[i+1];
}
else
{
if(max<vec[i+1])
max=vec[i+1];
if(min>vec[i])
min=vec[i];
}
}
}
else
{
//max=vec[0];
//min=vec[0];
for(int i=1;i<vec.size();i=i+2)
{
if(vec[i]>vec[i+1])
{
if(max<vec[i])
max=vec[i];
if(min>vec[i+1])
min=vec[i+1];
}
else
{
if(max<vec[i+1])
max=vec[i+1];
if(min>vec[i])
min=vec[i];
}
}
}
*p_max=max;
*p_min=min;
}
int main()
{
int a[9]={11,16,22,12,7,22,17,8,200};
int max,min;
vector<int> vec(a,a+9);
show_vec(vec);
find_max_min(vec,&max,&min);
cout<<"max is "<<max<<endl;
cout<<"min is "<<min<<endl;
return 0;
}