int fun16(int *t,int n,int b)
{
int lo =0;
int hi =n;
int mid =0;
while(lo < hi)
{
mid =(hi + lo)/2;
printf("->lo=%d mid=%d hi=%d\n",lo,mid,hi);
if(b == t[mid])
return mid;
else if(b > t[mid])
lo = mid+1;
else if(b < t[mid])
hi = mid;
printf("lo=%d mid=%d hi=%d\n",lo,mid,hi);
}
return NULL;
}
void test16()
{
int a[9]={1,4,7,8,10,12,15,30,100};
int i;
i=fun16(a,sizeof(a)/sizeof(a[0]),8);
printf("the query is at %d\n",i);
}
这里面要注意的几项是:
1.while的循环条件,while(lo < hi), 当找到你想要找到的值,会发现此事l0 == hi
2.看到上一条的朋友肯定会很好奇,为什么找到就一定相等呢?这其实和我马上要提到的第二点
当 b < t[mid] hi = mid; 而不是 hi =mid -1;<不信你可以试试,绝对找不到 8>
其原因在于 mid =(hi + lo)/2; 这个算法,他的取值往往是偏向浮点中间值小的一方.
以上两点注意了,我想问题不大了