【发布时间】:2013-05-07 23:14:04
【问题描述】:
我正在尝试在 Java 中实现二进制搜索,但我的代码存在一些问题。如果我要查找的元素存在于数组中,它会起作用。如果没有,程序不会打印错误消息。我的意思是——
当我运行我的代码时 - 这是输出 -
Please enter array size
2
Please enter element 0
3
Please enter element 1
4
Sorted array elements[3, 4]
Please enter the element you want to find in the array
3
Match 3 found at index 0
但是,如果我查找数组中不存在的元素,则程序不会进入 else 循环,并打印错误消息 - 而是这样做 -
Please enter array size
2
Please enter element 0
3
Please enter element 1
4
Sorted array elements[3, 4]
Please enter the element you want to find in the array
2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at arraysPract.BinarySearch.findElement(BinarySearch.java:82)
at arraysPract.BinarySearch.main(BinarySearch.java:54)
这里是代码 -
package arrays;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BinarySearch {
static int[] binaryArr = null;
public static void main(String[] args) {
BufferedReader br = null;
String size = "";
try {
System.out.println("Please enter array size");
br = new BufferedReader(new InputStreamReader(System.in));
size = br.readLine();
if (size == null) {
System.out.println("Size can't be null");
return;
}
int ipSize = Integer.parseInt(size);
binaryArr = new int[ipSize];
String entry = "";
for (int i = 0; i < ipSize; i++) {
System.out.println("Please enter element " + i);
entry = br.readLine();
if (entry == null) {
System.out.println("Value can't be null");
return;
}
int arrEntry = Integer.parseInt(entry);
binaryArr[i] = arrEntry;
}
Arrays.sort(binaryArr);
System.out.println("Sorted array elements" + Arrays.toString(binaryArr));
System.out.println("\n");
System.out.println("Please enter the element you want to find in the array");
String findArrayElement = br.readLine();
int find = Integer.parseInt(findArrayElement);
boolean elementExists = Arrays.asList(binaryArr).contains(find);
if (elementExists==false) {
findElement(binaryArr, find);
}
else {
System.out.println("Element does not exist. Please try again");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static int findElement(int[] test, int keyElement) {
boolean flag = true;
int i = 0;
for (i = test.length / 2; i >= 0 && i < test.length;) {
if (keyElement == test[i]) {
flag = false;
break;
} else if (keyElement > test[i]) {
i++;
if (keyElement == test[i]) {
flag = false;
} else {
flag = true;
}
} else if (keyElement < test[i]) {
i--;
if (keyElement == test[i]) {
flag = false;
} else {
flag = true;
}
}
}
if (flag == false) {
System.out.println("Match " + keyElement + " found at index " + i);
}
return i;
}
}
如果我忽略了一些明显的错误,请有人指导我?
此外,这篇文章有几个可能的重复项 - Binary search in java、Binary search in java 等。我只需要帮助来审查我的代码,而不是实现程序:)
【问题讨论】:
-
这不是一个开始的二进制搜索,我建议你阅读 Arrays.binarySearch 的代码,看看它是什么样子的。它也短得多。 ;)
-
我想实现自己的算法,所以我没有使用 Arrays.binarySearch。为什么说它不是二分查找?
-
这不是二分搜索,因为您只是在遍历数组的上半部分或下半部分。这提供了 O(n/2) 的性能,或者换句话说 O(n)。二分搜索不断将它正在搜索的区域减半,这提供了 O(log n)。
-
@user2341013 这不是二分搜索,因为它不具有时间复杂度为 O(log(n)) 的特性——也就是说,它不是平均只多走一步来搜索两倍大的数组,平均需要两倍的时间(因为您是在进行线性搜索,而不是重复地将数组一分为二)
标签: java