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