二分查找

为君一笑 提交于 2020-03-01 09:57:50

1,定义
二分查找也称折半查找,前提是线性表中的记录必须是有序的(通常从小到大有序) ,线性表必须采用顺序存储,它是一种效率较高的查找方法。

2,基本思想
(1)在有序表中,取中间数据作为比较对象,若给定值与中间记录的关键字相 等,则查找成功;
(2)若给定值小于中间记录的关键字,则在中阔记录的左半区继续查找;
(3)若给定值大于中间记录的关键字,则在中间记录的右半区继续查找;
(4)不断重复上述过程,直到查找成功,或所有查找区域元记录,查找失败为止。

3,实现代码

int BinarySearch(int *a, int length, int key)
{
    int low  = 1;
    int high = length;
    int mid;
    while (low <= high)
    {
        mid = (low+high)/2;
        if (key<a[mid])
            high = mid-1;
        else if (key>a[mid])
            low = mid+1;
        else
            return mid;
    }
    return 0;
}

例题: 《切绳子》

描述:
有n条绳子,长度分别为L[i]。如果从他们中切割出k条长度相同的绳子的话,这k条绳子每条最长能有多长?(答案保留小数点后两位,规定1单位长度的绳子最多可以切割成100份)

格式:
输入格式
输入n,k,(1<=n,k<=10000)
然后n行,输入L[i],代表每一条绳子的长度(1<=L[i]<=100000)

输出格式
切出k条长度相等的绳子最大长度是多少,输出保留两位小数

AC代码:

#include<stdio.h>
int n,k;
double e,a[100010];
int  judge(int m)//判断是否能切成k段
{
    int sum=0;
    for(int i=1; i<=n; i++)
    {
        sum+=a[i]/m;
    }
    if(sum>=k)
        return 1;
    else
        return 0;
}
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        int maxs=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%lf",&e);
            a[i]=e*100;//先放大100倍存入
            if(maxs<a[i])
                maxs=a[i];//得到最长绳子的长度
        }
        int left=0,mid,right=maxs;//在0到最大长度之中进行二分
        while(left<=right)
        {
            mid=(left+right)/2;
            if(judge(mid))//进行当前长度的判断
                left=mid+1;
            else
                right=mid-1;
        }
        double res=right/100.0;
        printf("%.2lf\n",res);
    }
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!