一个 简单的二分查找
前些天看到 编程珠玑 上说一个简单的二分搜索都会有许多的错误。 于是自己好好写了下。
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的大小,对于大部分查找要么是大或者是小。
至于这段代码还有什么错误,请指出改正。
浙公网安备 33010602011771号