java - 创建一个二分搜索函数,返回数组中所需元素最左边出现的索引

标签 java binary binary-search

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

  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;
}

最佳答案

契约(Contract)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;
}

关于java - 创建一个二分搜索函数,返回数组中所需元素最左边出现的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32895969/

相关文章:

javascript - 如何使用递归创建二分查找

java - 使用 Spring Batch 汇总数据

java - MarkLogic 通配符搜索 - 控制台与 Java API

java - 在文件读取期间强制 IOException

字符数组到二进制数组不起作用

file-io - 以Fortran : Status,格式打开二进制文件,访问权限

java - 大O : is this the tightest upper bound for recursive algorithm?

c - C中的二进制搜索中的段错误

java - 在 Java 中使用 Matcher 和 Pattern 对象时出现问题

java - 输出多于 8 位的二进制数