二分查找

 
#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的值

posted @ 2017-09-01 14:02  小时候挺菜  阅读(247)  评论(0编辑  收藏  举报