老板有一袋金块(共n块,n是2的幂(n>=2)),最优秀的雇员得到其中最重要的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。
C++代码:
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
void max_min(vector<int> v,int i,int j,int &max_n, int &min_n)
{
//子问题规模较小,解决子问题
if (i == j)
{
max_n = v[i];
min_n = v[i];
return ;
}
else if ( i+1 == j)
{
if (v[i]<v[j])
{
max_n = v[j];
min_n = v[i];
}
else
{
min_n = v[j];
max_n = v[i];
}
return;
}
//分解原问题为更小的子问题
int max1_n,min1_n,max2_n,min2_n;
max_min(v,i,(i+j)/2,max1_n,min1_n);
max_min(v,(i+j)/2+1,j,max2_n,min2_n);
//合并子问题
max_n = max1_n>max2_n?max1_n:max2_n;
min_n = min1_n<min2_n?min1_n:min2_n;
return;
}
int main()
{
srand(unsigned(time(0)));
vector<int> v;
for (int i=0;i<10;++i)
{
v.push_back(rand());
}
for (int i=0;i<10;++i)
{
cout<<v[i]<<' ';
}
cout<<endl;
int max_n,min_n;
max_min(v,0,9,max_n,min_n);
cout<<"最大数:"<<max_n<<'\t'<<"最小数:"<<min_n<<endl;
return 0;
}
运行结果: