递归与分治策略——金块问题

问题

  • 老板有一袋金块。每个月将有两名雇员会因其优异的表现分别被奖励一个金块。按规矩,排名第一的雇员将得到袋中最重的金块,排名第二的雇员将得到袋中最轻的金块。根据这种方式,除非有新的金块加入袋中,否则第一名雇员所得到的金块总是比第二名雇员所得到的金块重。如果有新的金块周期性的加入袋中,则每个月都必须找出最轻和最重的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最轻和最重的金块。

代码

#include <stdio.h>
#include <stdlib.h> 
int compare1(int i,int j,int a[])//找最大值
{    
    int m1,m2,mid,max=0;    
    if(i==j)        
        max=a[i];//当分组的下标i与j相等时,将a[i]赋给最大值    
    else if(i==j-1)//当分组的下标i与j相等时,判断a[i]与a[j]大小并赋予max值    
    {        
        if(a[i]>=a[j])            
            max=a[i];        
        else            
            max=a[j];    
    }    
    else    
    {        
        mid=i+(j-i)/2;//找到中点        
        m1=compare1(i,mid,a);//递归找出第一组最大值m1        
        m2=compare1(mid+1,j,a);//递归找出第二组最大值m2       
        if(m1>=m2)//判断m1和m2的大小,得到最大值max            
            max=m1;        
        else            
            max=m2;        
        return max;//返回值max    
    }
}
int compare2(int i,int j,int a[])//找最小值
{    
    int n1,n2,mid,min=0;    
    if(i==j)        
        min=a[i];//当分组的下标i与j相等时,将a[i]赋给最大值和最小值    
    else if(i==j-1)//当分组的下标i与j相等时,判断a[i]与a[j]大小并赋予max,min值    
    {        
        if(a[i]<=a[j])            
            min=a[i];        
        else            
            min=a[j];    
    }    
    else    
    {        
        mid=i+(j-i)/2;//找到中点        
        n1=compare2(i,mid,a);//递归找出第一组最小值n1        
        n2=compare2(mid+1,j,a);//递归找出第二组最小值n2       
        if(n1<=n2)//判断n1和n2的大小,得到最小值min            
            min=n1;        
        else            
            min=n2;        
        return min;//返回值min    
    }
}
int main()
{    
    int n,i=0,a[100],s,t;//定义变量    
    scanf("%d",&n);//输入数组大小    
    for(;i<n;i++)   
    {        
        scanf("%d",&a[i]);//循环输入数组元素    
    }    
    s=compare1(0,n-1,a);//利用函数compare1找出最大值s    
    t=compare2(0,n-1,a);//利用函数compare2找出最小值t    
    printf("%d %d",s,t);//输出最大值和最小值
}
    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/imumuK/article/details/85063803
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞