在查看this教科书页面上的示例后,我正在尝试实现递归二进制搜索。
我的算法似乎在大多数情况下都能正常工作,但是在高于数组中最高值的值时,我得到ArrayIndexOutOfBoundsException
。看看我的算法和教科书的例子,它们看起来完全相同;有人能帮我找到我出错的地方吗?
我知道这与this thread中的问题大致相同,我已经考虑了它提出的解决方案。但是,示例代码没有像这样实现任何参数更正,我想知道为什么没有它就可以工作。
public static int binarySearch(int[] array, int item, int lowPos, int highPos){
if (lowPos > highPos){
return -1;
}
int mid = (lowPos + highPos)/2;
if (array[mid] == item){
return mid;
}else if (array[mid] > item){
return binarySearch(array, item, lowPos, mid-1);
}else{
return binarySearch(array, item, mid+1, highPos);
}
}
这是教科书示例,显然不会产生错误:
static int binarySearch(int[] A, int loIndex, int hiIndex, int value) {
if (loIndex > hiIndex) {
// The starting position comes after the final index,
// so there are actually no elements in the specified
// range. The value does not occur in this empty list!
return -1;
}
else {
// Look at the middle position in the list. If the
// value occurs at that position, return that position.
// Otherwise, search recursively in either the first
// half or the second half of the list.
int middle = (loIndex + hiIndex) / 2;
if (value == A[middle])
return middle;
else if (value < A[middle])
return binarySearch(A, loIndex, middle - 1, value);
else // value must be > A[middle]
return binarySearch(A, middle + 1, hiIndex, value);
}
} // end binarySearch()
答案 0 :(得分:2)
您的代码很好,您只是错误地传递了值。您可能正在使用错误的highPos来启动您的方法,如果是这种情况,请使用myArray.length -1而不是myArray.length。
否则,您为修改后的方法调用参数完全错误,可能会切换值。调用代码应如下所示。
binarySearch(myArray, myIntToSearchFor, 0, myArray.length-1)
答案 1 :(得分:1)
我相信您将array.length
而不是array.length - 1
作为highPos
的参数传递。