一个 简单的二分查找

前些天看到 编程珠玑 上说一个简单的二分搜索都会有许多的错误。 于是自己好好写了下。

static int binearySearch(int A[], int value){
        int left,right,middle;
        left = 0;
        right = A.length-1;  //索引是从 0-A.length-1  的
        while( left<=right ){
//            middle = (left+right)/2;  //这里可能溢出
//            middle = left + ((right-left)>>1);  //防止溢出
            middle = (right + left)>>>1;
            if( A[middle] > value )
                right = middle-1;
            else if( A[middle] < value )
                left = middle+1;
            else
                return middle;
        }
        return -1;
    }

 

我觉得主要问题是出在 middle那里。  

middle = (left+right)/2; 是会溢出的。
middle = left + ((right-left)>>1); 可以防止溢出,但是一次加法,一次减法,一次移位有三个操作。
middle = (right + left)>>>1; 然后在网上看到一个使用这个 无符号移位 不但简单,而且可以解决溢出问题。

另外没有直接先比较A[middle] 和 value的大小,对于大部分查找要么是大或者是小。

至于这段代码还有什么错误,请指出改正。
 
posted @ 2013-04-07 19:51  seanoop  阅读(172)  评论(0)    收藏  举报