首页 > 试题广场 >

对于输入array为:{2, 6, 8, 10, 13, 2

[单选题]
考虑以下二分查找的代码:
#include <stdio.h>
int bsearch(int array[], int n, int v)
{
    int left, right, middle;
    left = 0, right = n - 1;
    while (left <= right) {
        middle = left + (right - left) / 2;
        if (array[middle] > v ) {
            right = middle;
        } else if (array[middle] < v) {
            left = middle;
        } else {
            return middle;
        }
  } 
    return -1;
}
对于输入array为:{2, 6, 8, 10, 13, 25, 36, 45, 53, 76, 88, 100, 127}, n = 13, v = 127时,
运行bsearch函数,while循环调用的次数为____。
  • 1
  • 3
  • 4
  • 5
  • 6
  • 无数次
推荐
F
本题是一个坑,这是不正确的二分查找法,当中间的没有找到的时候,left和right下标应该左移或者右移(left++,right--),实质是( right = middle-1,left=middle+1),才不会出现除以二向下取值的时候出现无限循环。
编辑于 2015-12-16 15:13:19 回复(8)
left会一直等于11,无法结束循环
发表于 2015-08-24 15:43:10 回复(0)
第一次middle=6,第二次middle=9,第三次middle=10,第四次middle=11,之后由于middle=11+(12-11)/2=11,一直没有变化所以为无数次
发表于 2015-08-24 23:15:20 回复(3)
要注意:中间有个坑,right = middle - 1; left = middle + 1时才是真正的二分搜索法。
发表于 2016-12-25 18:10:07 回复(0)
选 无数次。
经推算:
第一次middle=6;
第二次middle=9;
第三次middle=10;
第四次middle=11;
之后由于middle=11+(12-11)/2=11,middle值一直没有变化,所以为无数次
发表于 2018-03-12 22:08:18 回复(0)
题目太坑了,还说是二分查找。。。直接说看以下代码不就行了,这坑挖的我真无语了。。。
发表于 2017-08-29 19:58:44 回复(0)
到十一就不对了,一直上不去,毕竟不是真正的二分查找
发表于 2016-04-12 20:31:45 回复(0)
大意了
发表于 2016-03-05 11:01:00 回复(0)
右-1,左+1
发表于 2021-11-24 10:51:47 回复(0)

二分查找两点注意:

  1. while循环判断条件:left 小于等于 right
  2. 更新middle值是 left-1right+1
发表于 2021-06-03 09:49:32 回复(0)
写的以下是二分查找的代码,但是却没有实现二分查找
发表于 2020-09-24 00:24:10 回复(0)
中间有坑注意下,别问我为啥知道的,因为我踩坑了、第一次middle=6,第二次middle=9,第三次middle=10,第四次middle=11,之后由于middle=11+(12-11)/2=11,一直没有变化所以为无数次
发表于 2020-06-03 14:06:01 回复(0)
(11+12)/2=11
(11+12)/2=11
(11+12)/2=11
(11+12)/2=11
(11+12)/2=11
(11+12)/2=11
(11+12)/2=11
(11+12)/2=11
...

发表于 2020-05-27 17:28:06 回复(0)
最后left=11,right=12。此时计算middle值为11,但是由于代码“left=middle;”没有自增1,所以left值不会被改变,造成死循环的情况。
发表于 2020-03-04 13:59:38 回复(0)
middle的取值是左+(右—左)/2
发表于 2019-06-03 11:39:31 回复(0)
本题主要考察程序阅读能力
发表于 2018-12-07 23:43:23 回复(0)
当middle不是要目标元素时  注意:
left = middle+1
或者
right =middle-1
发表于 2018-12-05 09:16:00 回复(0)
不要看循环
看到while (left <= right) 有等于就知道永远出不去了
发表于 2018-08-22 11:27:34 回复(0)
是坑没跑了,当left为11,right为12时,left= middle = left + (right - left) / 2; 始终不变了,会一直循环
发表于 2018-07-12 16:27:39 回复(0)
right = middle + 1; left = middle + 1

发表于 2018-04-29 22:56:14 回复(0)
无聊
发表于 2017-12-03 19:21:54 回复(0)