首页 > 技术文章 > 从二分看算法严谨性

freeopen 2016-04-20 17:56 原文

考虑以下二分查找的代码:
#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
原因:第一个代码在最后两个数的时候收敛了到了前一个数,不能向前推进使得
达到循环结束条件,如果保证leftright以最小区间去逼近,才能够绝对收敛或
使得循环条件终止

推荐阅读