二进制搜索java中的小错误

时间:2014-02-04 10:52:25

标签: java

int m, l, f, k = 4;
int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

f = 0;
l = a.length - 1;
m = (f + l) / 2;

for (int i = 0; i < a.length; i++) {
    if(a[m] > k) {
        f = 0;
        l = m - 1;
    }
    if(a[m]<k) {
        f = m + 1;
        l = a.length - 1;
    }       
    m = (f + l) / 2;
}
if(k == a[m]) {
    System.out.println("found");
} else {
    System.out.println("not found");
}

当我把k = 4和k = 6时,它说没有找到.... ????? 我可能知道职位需要正确吗

2 个答案:

答案 0 :(得分:1)

错误在这里:

if(a[m] > k) {
    f = 0;             // Error number one
    l = m - 1;
}
if(a[m]<k) {
    f = m + 1;
    l = a.length - 1;  // Error number two
}       

您的二进制搜索代码不应调整范围的两端。相反,只应调整一端。

此外,您的代码不会涵盖a[m] == k正确的情况,这意味着当您找到项目时,您的代码将继续循环直到for循环结束(见下文)

最后,循环应该在f == l时停止,而不是在i到达a.length时停止(并且它应该是while循环,而不是for循环)。

答案 1 :(得分:0)

使用此:

    int middle;
    int right;
    int left;

    int k = 1;

    int[] a = {1,2,3,4,5,6,7,8,9,10};

    left = 0;
    right = a.length - 1;

    middle = (left + right)/2;

    for (int i = 0; i < a.length; i++ ) {
        if(a[middle] > k) {
            right = middle - 1;
        }
        if(a[middle] < k) {
            left = middle + 1;
        }
        middle=(left + right)/2;
    }

    if (k == a[middle]) {
        System.out.println("found");
    } else {
        System.out.println("not found");
    }

此外,您应该更加注意变量名称。像i, k, m, a这样的名字确实具有误导性。