现在的位置: 首页 > 综合 > 正文

C语言二分法

2013年02月19日 ⁄ 综合 ⁄ 共 606字 ⁄ 字号 评论关闭

 

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; 这个算法,他的取值往往是偏向浮点中间值小的一方.

 

以上两点注意了,我想问题不大了

抱歉!评论已关闭.