金块问题
分治算法——分治算法的基本思想(分-治-合)
用递归设计分治算法的基本步骤(基准与递归方程)
老板有一袋金块(共n块,n是2的幂(n≥2)),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。
#include<stdio.h>
//比较重量大小的函数
float min(float x,float y)
{
if(x<y)
return x;
else
return y;
}
float max(float x,float y)
{
if(x>y)
return x;
else
return y;
}
float Find_min(float A[],int left,int right) //这里是寻找最轻的金块的函数
{
float la,ma,ra;
if(left==right) //对于n=1的情况
{
float min;
min=A[right];
return min;
}
if(right-left==1.0) //对于n=2的情况
{
la=A[left];
ra=A[right];
return(min(la,ra));
}
if(right-left>1.0) //对于n>2的情况
{
ma=(left+right)/2.0;
la=Find_min(A,left,ma);
ra=Find_min(A,ma,right);
return(min(la,ra));
}
}
float Find_max(float A[],int left,int right) //寻找最重金块的函数
{
float la,ma,ra;
if(left==right)
{
float max;
max=A[right];
return max;
}
if(right-left==1.0)
{
la=A[left];
ra=A[right];
return(max(la,ra));
}
if(right-left>1.0)
{
ma=(left+right)/2.0;
la=Find_max(A,left,ma);
ra=Find_max(A,ma,right);
return(max(la,ra));
}
}
int main()
{
float A[100];
int n;
float min;
float max;
printf("请输入金块数目:\n");
scanf("%d",&n);
printf("请输入%d块金子的重量:\n",n);
for(int i=0;i<n;i++)
scanf("%f",&A[i]);
printf("最重的金块:");
max=Find_max(A,0,n-1);
printf("%.1f\t\t",max);
printf("最轻的金块:");
min=Find_min(A,0,n-1);
printf("%.1f",min);
printf("\n");
return 0;
}
来源:CSDN
作者:Zhang5801
链接:https://blog.csdn.net/Zhang5801/article/details/103609425