我将此代码用于二进制搜索。
public class BinarySearch {
private static int location;
private static int a = 14;
static int[] numbers = new int[]{3, 6, 7, 11, 14, 16, 20, 45, 68, 79};
public static int B_Search(int[] sortedArray, int key) {
int lowB = 0;
int upB = sortedArray.length;
int mid;
while (lowB < upB) {
mid = (lowB + upB) / 2;
if (key < sortedArray[mid]) {
upB = mid - 1;
} else if (key > sortedArray[mid]) {
lowB = mid + 1;
} else {
return mid;
}
}
return -1;
}
public static void main(String[] args) {
BinarySearch bs = new BinarySearch();
location= bs.B_Search(numbers, a);
if(location != -1){
System.out.println("Find , at index of: "+ location);
}
else{
System.out.println("Not found!");
}
}
}
//输出: 一个= 14
未找到!!
为什么?
答案 0 :(得分:5)
首先,值得逐步调试调试器中的代码,看看是否可以找出问题所在。但是,根据经验我知道这个特定的bug可能很难诊断。
您需要了解您的上限和下限是包含还是排他。我怀疑上限是独占,但你的下限是包含(这很正常)。这意味着:
upB = mid - 1;
实际应该是:
upB = mid;
我们知道正确的索引不是mid
,但可能更低。您当前的代码会排除该值...而固定代码仅排除mid
。
正如其他答案所示,您可以初始化并以不同方式比较upB
,并使其成为包含上限。就个人而言,我更喜欢把它排除在外,因为很多计算机科学都是这样工作的。但两者都有效。
现在,请确保您真正理解这里发生了什么。 不要只是复制代码并继续前进;弄清楚这一切是如何挂在一起的。
答案 1 :(得分:3)
在lowB == upB
时,您需要在任意返回sortedArray[lowB] == key
之前检查-1
是否正确。
答案 2 :(得分:3)
用两种不同的东西初始化upB。最初它指向结束后指向最后一个元素:
试试这个:
int upB = sortedArray.length-1;
int mid;
while (lowB <= upB) {