二分查找

二分查找详解
本文介绍了一种常用的搜索算法——二分查找,并通过递归和非递归两种方式实现了该算法。此外,还讨论了计算中间值时可能发生的整数溢出问题及解决方案。
 
#include <stdio.h>
#include <stdlib.h>
int erFensearch(int a[],int n,int key)
{
int low=0;
int high=n-1;
while(low<=high)
{
int mid=(low+high)/2;
if(a[mid]<key) low=mid+1;
else if(a[mid]>key) high=mid-1;
else return mid;
}
return -1;
}

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

int main()
{
int a[10]={12,15,18,28,36,45,85,164,232,311};
int c;
c=Nodigui(a,0,9,36);
printf("%d",c);
return 0;
}
 

 
 

 

补充:

上述代码中,用到了一句话计算中间值:

int mid=(low+high)/2;

其实这里面有个漏洞,就是容易产生溢出,如果low和high是很大的值并且很接近的话,他们俩个相加,则会发生超出数据类型的溢出。

修改为以下代码可以避免:

int mid=low + (high-low)/2;

从计算公式上来看,两个结果是一样的,但是看第二个公式,因为hign肯定不会溢出,所以high-low也肯定不会溢出,并且即使low加上(high-low)/2后,也不会超过high的值

转载于:https://www.cnblogs.com/zzdbullet/p/9949759.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值