我正在尝试使用java编程语言实现二进制搜索。 很明显,应该对数组进行排序以便使用二进制搜索,因为它使用了分而治之的概念。当元素在数组内时和不在时,代码适用于两种情况。但是,当我输入的数字大于数组中的最大数字时,程序将崩溃并给出Index Out Of Bound异常。
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);
}
}
答案 0 :(得分:1)
这应该可以解决您的问题
int upper = arr.length-1;
如果您要查找的数字大于最大数字,那么您一定要查看数组的最后一个元素。
但是在您的代码upper
中,初始值比最后一个元素的索引多1。
答案 1 :(得分:0)
您可以使用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
真正进行搜索。