Java二进制搜索,高值抛出异常

时间:2013-06-06 16:28:54

标签: java search binary indexoutofboundsexception

在查看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()

2 个答案:

答案 0 :(得分:2)

您的代码很好,您只是错误地传递了值。您可能正在使用错误的highPos来启动您的方法,如果是这种情况,请使用myArray.length -1而不是myArray.length。

否则,您为修改后的方法调用参数完全错误,可能会切换值。调用代码应如下所示。

binarySearch(myArray, myIntToSearchFor, 0, myArray.length-1)

答案 1 :(得分:1)

我相信您将array.length而不是array.length - 1作为highPos的参数传递。