java中的二进制搜索

时间:2013-03-01 20:53:50

标签: java binary-search

我将此代码用于二进制搜索。

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

未找到!!

为什么?

3 个答案:

答案 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) {