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;
}
来源:CSDN
作者:Ysming88
链接:https://blog.csdn.net/m0_45861545/article/details/104579563