我试图创建一个二进制搜索功能,但我一直陷入循环。我仅限于使用这种磁铁。该程序已经为我提供了要搜索的元素。下面的代码创建一个无限循环。

  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更新为中间索引之后。
如果结果为零,则我们找到了正确的索引。


另外,一旦更新了firstlast变量,就不会更新中间元素,因此应在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;
}

10-07 12:02
查看更多