自定义二进制搜索功能无法正常工作

时间:2017-10-26 19:33:53

标签: java loops binary-search

我正在创建自定义二进制搜索功能并遇到问题。我现在已经查看了一段时间的代码,但是,我无法弄清楚为什么没有返回。请让我知道你在想什么。谢谢!

a是数组,b是最后返回的结果,t是目标值。 Pos是当前位置,min和max是最小和最大位置。

public static int binarySearch(int a[], int t){
    int min = 0;
    int max = a.length;
    if (a[0] == t){
        return 0;
    }
    int b = -1;
    for (int pos = min; a[pos] != t;){
        pos = (max - min) / 2;
        if (a[pos] == t){
            b = pos;
        } else {
            if(t > a[pos]){
                min = pos + 1;
            } else {
                min = pos - 1;
            }
        }
    }
    return b;
}

2 个答案:

答案 0 :(得分:2)

两个小问题

pos = (max - min) / 2;

看起来你正试图找到值的平均值,而是找到差异的一半

要找到平均值,请使用pos = (max - min) / 2 + min;

同时向下移动max时,您不小心将min向上移动

min = pos - 1;应改为max = pos - 1;

答案 1 :(得分:0)

我发现您的代码有三个问题:

  1. 您的循环条件不足以确定整个过程的终止。您的循环条件为a[pos] != t,您只会增加或减少pos,如果我们搜索的元素无法在数组中找到,则最终会导致ArrayIndexOutOfBoundsException

  2. 您的if-else不正确,因为您只更新 min 的值,而不是更新max。

  3. 而不是'移动'值pos每次减半,你只需设置最小值和最大值的平均值即不正确。

  4. 结合以上所有内容,您将得到以下结果:

    public static int binarySearch(int a[], int t) {
        int min = 0;
        int max = a.length;
    
        if (a[0] == t) {
            return 0;
        }
        int b = -1;
        for (int pos = min; a[pos] != t;) {
            pos = min + (max - min) / 2;
    
            if (pos >= a.length || pos <= 0) {
                break;
            }
    
            if (a[pos] == t) {
                b = pos;
            } else {
                if (t > a[pos]) {
                    min = pos + 1;
                } else {
                    max = pos - 1;
                }
            }
        }
        return b;
    }
    
相关问题