Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在双音数组中搜索变成无限循环_Java_Search - Fatal编程技术网

Java 在双音数组中搜索变成无限循环

Java 在双音数组中搜索变成无限循环,java,search,Java,Search,我试图在双音数组中编写一个搜索算法。请看一下升序函数,我在这里打印“lo”。当我运行此代码时,它会一直打印“lo”编号。我不明白为什么它会变成无限循环。这是我的密码: public class bitonicArray { public int ascending(int[] a, int key, int lo, int hi) { int mid = lo+(hi-lo)/2; while(lo<=hi) { if (k

我试图在双音数组中编写一个搜索算法。请看一下升序函数,我在这里打印“lo”。当我运行此代码时,它会一直打印“lo”编号。我不明白为什么它会变成无限循环。这是我的密码:

public class bitonicArray {

    public int ascending(int[] a, int key, int lo, int hi) {
        int mid = lo+(hi-lo)/2;
        while(lo<=hi) {
            if (key<a[mid]) hi = mid-1;
            else if (key>a[mid]) {
                lo=mid+1;
                System.out.println(lo);
            }
            else return mid;
        }
        return -1;
    }

    public int descending(int[] a, int key, int lo, int hi) {
        int mid=lo+(hi-lo)/2;
        while(lo<=hi) {
            if(key<a[mid]) lo = mid+1;
            else if(key>a[mid]) {
                hi = mid-1;
            }
            else return mid;
        }
        return -1;
    }

    public int bitonicPoint(int[] a) {
        int hi = a.length-1;
        int lo = 0;
        int mid = (hi-lo)/2;
        while(mid<=hi) {
            if (a[mid-1] < a[mid] && a[mid+1]>a[mid]) mid = mid + 1;
            else if (a[mid-1] > a[mid] && a[mid+1]<a[mid]) mid = mid - 1;
            else if (a[mid-1]<a[mid] && a[mid+1]<a[mid]) return mid;
        }
        return -1;
    }

    public int ind(int[] a, int key) {
        int lo = 0;
        int hi = a.length-1;
        int bit = bitonicPoint(a);
        int asc = ascending(a, key, lo, bit-1);
        System.out.println(asc);
        int desc = descending(a, key, bit+1, hi);
        if (asc != -1) {
            System.out.println(asc);
            return asc;
        }
        else if (desc != -1) return desc;
        else return bit;        
    }

    public static void main(String[] args) {
        int n[]= {1,3,4,6,9,14,11,7,2,-4,-9};
        bitonicArray ba = new bitonicArray();
        System.out.println(ba.ind(n, 6));   
    }
}
公共类二进制数组{
公共整数递增(整数[]a,整数键,整数低,整数高){
int-mid=lo+(hi-lo)/2;

虽然(lo在代码片段的这一部分中,您没有更新您的
mid

public int ascending(int[] a, int key, int lo, int hi) {
    int mid = lo+(hi-lo)/2;
    while(lo<=hi) {
        if (key<a[mid]) hi = mid-1;
        else if (key>a[mid]) {
            lo=mid+1;
            System.out.println(lo);
        }
        else return mid;
    }
    return -1;
}
因此,您将打印第一个
lo
值,但随后更新了
lo
值,但没有更新
mid
。 因为每次
mid
都是2,每次它进入相同的代码片段时都在while循环中。您需要更新
mid
的值,因为它依赖于
lo
hi
,在上面的
中,如果
部分您更新了
lo
的值

更正代码为:

public int ascending(int[] a, int key, int lo, int hi) {
    int mid = 0;
    while(lo<=hi) {
        mid = lo+(hi-lo)/2;
        if (key<a[mid]) hi = mid-1;
        else if (key>a[mid]) {
            lo=mid+1;
            System.out.println(lo);
        }
        else return mid;
    }
    return -1;
}
public int升序(int[]a,int-key,int-lo,int-hi){
int-mid=0;
而(低)
public int ascending(int[] a, int key, int lo, int hi) {
    int mid = 0;
    while(lo<=hi) {
        mid = lo+(hi-lo)/2;
        if (key<a[mid]) hi = mid-1;
        else if (key>a[mid]) {
            lo=mid+1;
            System.out.println(lo);
        }
        else return mid;
    }
    return -1;
}