算法分治之金块问题

金块问题

分治算法——分治算法的基本思想(分-治-合)
用递归设计分治算法的基本步骤(基准与递归方程)
老板有一袋金块(共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;
}

在这里插入图片描述

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值