我正在创建自定义二进制搜索功能并遇到问题。我现在已经查看了一段时间的代码,但是,我无法弄清楚为什么没有返回。请让我知道你在想什么。谢谢!
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;
}
答案 0 :(得分:2)
两个小问题
pos = (max - min) / 2;
看起来你正试图找到值的平均值,而是找到差异的一半
要找到平均值,请使用pos = (max - min) / 2 + min;
同时向下移动max
时,您不小心将min
向上移动
min = pos - 1;
应改为max = pos - 1;
答案 1 :(得分:0)
我发现您的代码有三个问题:
您的循环条件不足以确定整个过程的终止。您的循环条件为a[pos] != t
,您只会增加或减少pos
,如果我们搜索的元素无法在数组中找到,则最终会导致ArrayIndexOutOfBoundsException
。
您的if-else不正确,因为您只更新 min 的值,而不是更新max。
而不是'移动'值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;
}