考虑以下二分查找的代码:
#include <stdio.h>
intbsearch(intarray[], intn, intv)
{
intleft, right, middle;
left = 0, right = n - 1;
while(left <= right) {
middle = left + (right - left) / 2;
if(array[middle] > v ) {
right = middle;
} elseif (array[middle] < v) {
left = middle;
} else{
returnmiddle;
}
}
return-1;
}
对于输入array为:{2, 6, 8, 10, 13, 25, 36, 45, 53, 76, 88, 100, 127}, n = 13, v = 127时,
运行bsearch函数,while循环调用的次数为____。
1.middle = (0+12)/2=6
2.middle = (6+12)/2=9
3.middle = (9+12)/2=10
4.middle =(10+12)/2=11
5.middle = (11+12)/11....循环无数次!!!
#include <stdio.h>
intbsearch(intarray[], intn, intv)
{
intleft, right, middle;
left = 0, right = n - 1;
while(left <= right) {
middle = left + (right - left) / 2;
if(array[middle] > v ) {
right = middle-1;
} elseif (array[middle] < v) {
left = middle+1;
} else{
returnmiddle;
}
}
return-1;
}
1. middle = 6;
2.middle=(7+12)/2=9;
3.middle=(10+12)/2=11
4.middle=(12+12)/2=12....bingo
原因:第一个代码在最后两个数的时候收敛了到了前一个数,不能向前推进使得
达到循环结束条件,如果保证left,right以最小区间去逼近,才能够绝对收敛或
使得循环条件终止