-1

我不知道为什么这个方法抛出ArrayIndexOutOfBounds异常。binarySearch方法抛出ArrayIndexOutOfBounds异常 - Java

When I change the initial "high"值为"int high = array.length - 1;",程序将return any integer value,我搜索。

我在做什么错?

在此先感谢!


public class BinarySearch { 

public static void main(String[] args) { 

    int searchValue = 12; 
    int[] givenNums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    binarySearch(givenNums, searchValue); 
    System.out.println("\nResult: " + searchValue); 

} 

public static int binarySearch(int[] array, int key) { 
    int low = 0; 
    int high = array.length; 
    int mid = (low + high)/2; 
    int i = 0; 
    System.out.println(); 

    while (low <= high) { 
     System.out.print(i + " "); 
     if (array[mid] < key) { 
      low = mid + 1; 
      mid = (low + high)/2; 
     } else if (array[mid] > key) { 
      high = mid - 1; 
      mid = (low + high)/2; 
     } 
     else 
      return mid; 

     i++; 
    } 
    return -1; 
} 
} 
+1

您刚刚* *贴[一个非常类似的问题](http://stackoverflow.com/questions/12827289/的binarySearch-方法投掷-的ArrayIndexOutOfBounds-例外-java的)。你已经被告知为什么会发生这个错误:你不能设置高到'array.length'。让代码无法运行到完成状态并不比输出正确的答案更好(至少在本例中不是这样)。你不是通过将'high'设置为'array.length'而不是'array.length - 1'来解决任何问题,你只会让事情变得更糟。 – NullUserException

+0

@ user1735982 ..看到我的帖子,明白你到底在干什么.. –

+0

不同的方法,不同的问题。 –

回答

5

开始你需要约high是否意味着最大值一致它可以包括性专门 。你开始用它作为一个独特的上限:

int high = array.length; 

但随后你while循环的条件是,只有当它是一个包容上限适当:

while (low <= high) 

你或许应该只是改变while条件为:

while (low < high) 

...并更改的赋值后来也是。

或者,您可以保留它,并将初始值更改为array.length - 1

这将停止low == high == mid == array.length,这是它会炸毁的情况。

我还建议移动mid = (low + high)/2计算为while循环内的第一个语句 - 然后您可以摆脱重复的代码。在Java

while (low < high) {   
    mid = (low + high)/2; 
    System.out.print(i + " "); 
    if (array[mid] < key) { 
     low = mid + 1; 
    } else if (array[mid] > key) { 
     high = mid; 
    } 
    else { 
     return mid; 
    } 
    i++; 
} 
3

数组的最大指数为array.length - 1,因为他们从0

1

数组索引从0,这意味着...

INT [] ARR =新INT [10];

第一值ARR [0]和最后是ARR [9],长度是10。