java - 使用二分查找递归返回元素在排序数组中的插入位置

标签 java binary-search

如果该元素存在,我想从排序数组中返回该元素的位置,否则我想返回应插入该元素的插入位置。 这是我的代码:

    public static int bs(int[] array, int left, int right, int elem) {
    if (left > right) {
        return left;
    } else {
        int middle;
        middle = (left + right) / 2;
        if (left == right) { // used to return the insert position
            return left;
        } else if (elem > array[middle]) {
            return bs(array, middle + 1, right, elem);
        } else if ((elem < array[middle])) {
            return bs(array, left, middle - 1, elem);
        } else {
            return middle; // element existed into array
        }
    }
}

例如:

array = [ 2 5 8 10], elem = 8 => 将返回 2

array = [ 2 5 8 10], elem = 6 => 将返回 1

array = [ 2 7 14 22 32 56 88 91 102], elem = 3 => 将返回 1(但上面的程序返回 0)

最佳答案

您的错误是在 bs(left,middle-1) 时从 split 中删除 array[middle]。相反,您需要使用 bs(left,middle)bs(middle+1,right)。我将 print 添加到递归调用中并轻松找到了它。

public static int bs(int[] array, int left, int right, int elem) {
    System.out.println("["+left+", "+right+"]");
    if (left > right) {
        return left;
    } else {
        int middle;
        middle = (left + right) / 2;
        if (left == right) { // used to return the insert position
            return left;
        } else if (elem > array[middle]) {
            return bs(array, middle + 1, right, elem);
        } else if ((elem < array[middle])) {
            return bs(array, left, middle, elem); //<-- was: middle-1
        } else {
            return middle; // element existed into array
        }
    }
}

而且我认为这种风格会更好;)

public static int bs2(int[] array, int left, int right, int elem) {
    System.out.println("["+left+", "+right+"]");
    if (left >= right)
        return left;

    int middle;
    middle = (left + right) / 2;
    if (elem > array[middle])
        return bs(array, middle + 1, right, elem);
    if ((elem < array[middle]))
        return bs(array, left, middle, elem); //<--- was: middle-1
    return middle; // element existed into array
}

关于java - 使用二分查找递归返回元素在排序数组中的插入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51077234/

相关文章:

java - DTO 中的动态字段类型

java - popBackStack() 和 replace() 操作有何不同?

java - ViewResolver 不解析 View 名称,而是请求 URL,Spring 3.0

javascript - 数组极端情况下的二进制搜索

c++ - 线性搜索 vs 二进制搜索效率

java - @Transactional Spring 不创建新事务

java - 是否可以使用 OAuth2 创建基于角色的应用程序?

python - 返回列表中给定数字之前的数字

c++ - 如何对 std::map 中的部分键进行二进制搜索?

delphi - 实现 TObjectList<myClass> 的自定义二进制搜索 (Delphi XE)