int m, l, f, k = 4;
int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
f = 0;
l = a.length - 1;
m = (f + l) / 2;
for (int i = 0; i < a.length; i++) {
if(a[m] > k) {
f = 0;
l = m - 1;
}
if(a[m]<k) {
f = m + 1;
l = a.length - 1;
}
m = (f + l) / 2;
}
if(k == a[m]) {
System.out.println("found");
} else {
System.out.println("not found");
}
当我把k = 4和k = 6时,它说没有找到.... ????? 我可能知道职位需要正确吗
答案 0 :(得分:1)
错误在这里:
if(a[m] > k) {
f = 0; // Error number one
l = m - 1;
}
if(a[m]<k) {
f = m + 1;
l = a.length - 1; // Error number two
}
您的二进制搜索代码不应调整范围的两端。相反,只应调整一端。
此外,您的代码不会涵盖a[m] == k
正确的情况,这意味着当您找到项目时,您的代码将继续循环直到for
循环结束(见下文)
最后,循环应该在f == l
时停止,而不是在i
到达a.length
时停止(并且它应该是while
循环,而不是for
循环)。
答案 1 :(得分:0)
使用此:
int middle;
int right;
int left;
int k = 1;
int[] a = {1,2,3,4,5,6,7,8,9,10};
left = 0;
right = a.length - 1;
middle = (left + right)/2;
for (int i = 0; i < a.length; i++ ) {
if(a[middle] > k) {
right = middle - 1;
}
if(a[middle] < k) {
left = middle + 1;
}
middle=(left + right)/2;
}
if (k == a[middle]) {
System.out.println("found");
} else {
System.out.println("not found");
}
此外,您应该更加注意变量名称。像i, k, m, a
这样的名字确实具有误导性。