[英]Binary Search gives Index Out of Bound Exception in Java
我正在尝试使用Java编程语言实现二进制搜索。 显然,应该对数组进行排序以便使用二进制搜索,因为它使用了分而治之的概念。 当元素在数组中和元素不在数组中时,代码在两种情况下均能正常工作。 但是,当我输入的数字大于数组中的最大数字时,程序将崩溃并给出Index Out Of Bound Exception。
public class Binary {
public static void search(int arr[]) {
Scanner in = new Scanner(System.in);
int upper = arr.length;
int lower = 0;
int middle = 0;
int flag = 0;
int key;
/*
* flag = 0 ---> not found yet.
* flag = 1 ---> element is found.
* flag = 2 ---> no such element.
*/
System.out.println("Enter the number that you want to find... ");
key = in.nextInt();
while (flag == 0) {
middle = (int) (lower + upper) / 2;
if (key == arr[middle]) {
flag = 1;
}
if (key < arr[middle]) {
upper = middle - 1;
} else if (key > arr[middle]) {
lower = middle + 1;
}
if (lower > upper) {
flag = 2;
}
}
if (flag == 1) {
System.out.println(arr[middle] + " has been found, its index is: "
+ middle);
} else
System.out.println("Error, no such element.");
}
public static void main(String[] args) {
int arr[] = { 2, 4, 6, 8, 11, 34, 56 };
search(arr);
}
}
这应该可以解决您的问题
int upper = arr.length-1;
如果要查找的数字大于最大值,则一定要查看数组的最后一个元素。 但是在您的代码中, upper
的初始值比最后一个元素的索引大1。
您可以采用MisterDev的解决方案并更正上限。 通常,在Java数组中,下限是包含的,上限是排他的,但是,我喜欢lower
和upper
遵循这种模式的想法。
然后, lower < upper
表示范围不为空,并且在上半部分继续搜索时,中间点将成为新的互斥上限:
public static int search(int arr[], int key)
{
int upper = arr.length;
int lower = 0;
while (lower < upper) {
int middle = (lower + upper) / 2;
if (key == arr[middle]) return middle;
if (key < arr[middle]) {
upper = middle;
} else if (key > arr[middle]) {
lower = middle + 1;
}
}
return -1;
}
我已使函数将键作为参数并返回索引;如果找不到键,则返回-1。 我认为,接受用户输入和flag
与您的代码无关。 您应该为此编写一个包装器,以便Binary.search
实际上只是进行搜索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.