我正在创建自定义的二叉搜索函数,但遇到了问题。我已经浏览了代码很长时间了,但是,我无法弄清楚为什么没有任何返回。请让我知道你的想法。谢谢!
a 是数组,b 是最后返回的结果,t 是目标值。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 = (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;
我看到您的代码存在三个问题:
-
您的循环条件不足以确定整个过程的终止。您的循环条件是
a[pos] != t
的,并且您只会增加或减少pos
,如果我们搜索的元素在数组中找不到,最终会导致ArrayIndexOutOfBoundsException
。 -
您的 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;
}