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