Java 自定义二进制搜索函数工作不正常

Java 自定义二进制搜索函数工作不正常,java,loops,binary-search,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;

我正在创建一个自定义的二进制搜索函数,遇到了一些问题。我已经查看了代码很长一段时间了,但是,我不明白为什么什么都没有返回。请让我知道你的想法。谢谢大家!

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;
}
两个小问题

pos = (max - min) / 2;
看起来您试图找到这些值的平均值,但却发现了一半的差异

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

此外,当向下移动
max
时,您会意外地将
min
向上移动

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

两个小问题

pos = (max - min) / 2;
看起来您试图找到这些值的平均值,但却发现了一半的差异

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

此外,当向下移动
max
时,您会意外地将
min
向上移动


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

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

  • 您的循环条件不足以决定整个过程的终止。您的循环条件是
    a[pos]!=t
    并且您只会增加或减少
    pos
    ,如果在数组中找不到我们搜索的元素,则最终会导致
    arrayindexoutofbounds异常

  • 您的if-else不正确,因为您只更新最小值,而不更新最大值

  • 不是每次将值
    pos
    移动一半,而是将其设置为最小值和最大值的平均值,这是不正确的

  • 综合以上所有因素,您将得到以下结果:

    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;
    }
    
    publicstaticintbinarysearch(inta[],intt){
    int min=0;
    int max=a.长度;
    if(a[0]==t){
    返回0;
    }
    int b=-1;
    对于(int pos=min;a[pos]!=t;){
    pos=min+(max-min)/2;
    如果(位置>=a.length | |位置a[pos]){
    最小=位置+1;
    }否则{
    最大值=位置-1;
    }
    }
    }
    返回b;
    }
    
    我发现您的代码有三个问题:

  • 您的循环条件不足以决定整个过程的终止。您的循环条件是
    a[pos]!=t
    并且您只会增加或减少
    pos
    ,如果在数组中找不到我们搜索的元素,则最终会导致
    arrayindexoutofbounds异常

  • 您的if-else不正确,因为您只更新最小值,而不更新最大值

  • 不是每次将值
    pos
    移动一半,而是将其设置为最小值和最大值的平均值,这是不正确的

  • 综合以上所有因素,您将得到以下结果:

    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;
    }
    
    publicstaticintbinarysearch(inta[],intt){
    int min=0;
    int max=a.长度;
    if(a[0]==t){
    返回0;
    }
    int b=-1;
    对于(int pos=min;a[pos]!=t;){
    pos=min+(max-min)/2;
    如果(位置>=a.length | |位置a[pos]){
    最小=位置+1;
    }否则{
    最大值=位置-1;
    }
    }
    }
    返回b;
    }
    
    您尝试了哪些调试?你试过打印循环中的值吗?
    t
    a
    b
    都是毫无意义的:它们让你的代码难以阅读:你试过什么调试?你试过打印循环中的值吗?
    t
    a
    b
    都是毫无意义的:它们使你的代码难以阅读: