我试图创建一个二进制搜索功能,但我一直陷入循环。我仅限于使用这种磁铁。该程序已经为我提供了要搜索的元素。下面的代码创建一个无限循环。
public class Student < T extends Comparable <? super T >> {
public int binarySearchIter(T[] data, T key) {
int first = 0;
int last = data.length - 1;
int mid, result;
mid = (first + last) / 2;
result = key.compareTo(data[mid]);
while (first <= last) {
if (result == -1) {
return -1;
} else if (result > 0) {
first = mid + 1;
} else {
last = mid - 1;
}
}
return mid;
}
最佳答案
compareTo
方法的约定是返回正整数,0或负整数,具体取决于数字是大于,等于还是小于给定数字。这些数字可能为-1,也可能不是-1,因此您不能依赖于此。
因此,您应该像这样更改while循环:
如果结果为负,则键在中间元素之前,因此我们将last
更新为中间索引之前。
如果结果为正,则键位于中间元素之后,因此我们将first
更新为中间索引之后。
如果结果为零,则我们找到了正确的索引。
另外,一旦更新了first
和last
变量,就不会更新中间元素,因此应在while循环内移动该代码。
public static <T extends Comparable <T>> int binarySearchIter(T[] data, T key) {
int first = 0;
int last = data.length - 1;
int mid, result;
while (first <= last) {
mid = (first + last) / 2;
result = key.compareTo(data[mid]);
if (result < 0) {
last = mid - 1;
} else if (result > 0) {
first = mid + 1;
} else {
return mid;
}
}
return -1;
}