我们知道二进制搜索算法比线性搜索算法更好。该算法需要O(log n)的时间来执行。尽管在大多数情况下,已实现的代码仍存在一些问题。让我们考虑一个如下的二进制搜索算法函数-
int binarySearch(int array[], int start, int end, int key){
if(start <= end){
int mid = (start + end) /2); //mid location of the list
if(array[mid] == key)
return mid;
if(array[mid] > key)
return binarySearch(array, start, mid-1, key);
return binarySearch(array, mid+1, end, key);
}
return -1;
}在开始和结束达到大量之前,此算法将正常工作。如果(开始+结束)的值超过2 32 – 1,则结束后可能返回一个负数。并且由于不支持将负数用作数组索引,因此可能会引起一些问题。
为了克服这个问题,有几种不同的方法。
int mid = start + ((end - start) / 2)
第二种方法仅在Java中有效,因为C或C ++没有>>>运算符。
int mid = (start + end) >>> 1
由于C或C ++不支持>>>,因此我们可以使用以下方法。
int mid = ((unsigned int) low + (unsigned int) high) >> 1