二进制搜索程序未打印正确的索引

Posted

技术标签:

【中文标题】二进制搜索程序未打印正确的索引【英文标题】:Binary Search Program Not Printing Correct Index 【发布时间】:2021-12-15 05:42:27 【问题描述】:

我需要创建一个二分搜索程序,如果搜索键在数组中,它会返回 a[i] 等于键的最大索引 i,否则返回 -i,其中 i 是使 a[i] 小于 key 的最大索引。

示例运行如下。

更多输入.txt 2 3 4 5 6 6 6 7 8 9 11

java BinarySearch input.txt 10

-9

java BinarySearch input.txt 6

6

到目前为止,程序将打印输入文件中数字的正确索引,但当我输入不在列表中的数字时,它不会打印 -i。例如,当我在命令行中输入 10 时,它不会打印 -9;相反,它打印 -10。

public class BinarySearch

    public static int search(int key, int [] a, int lo, int hi)
      
        int n = a.length;
        
    if (hi >= lo) 
        
        int mid = lo + (hi - lo) / 2;
        if      ((mid == n-1 || key < a[mid+1]) && a[mid] == key) 
        return mid;
        else if (key < a[mid]) 
        return search(key, a, lo, (mid-1));
        else return search(key, a, (mid+1), hi);
           
    return -1*lo;
    
    public static void main (String [] args)
    
        In in = new In(args[0]);
        
        int key = Integer.parseInt(args[1]);
        
        int [] a = in.readAllInts(); 
        
        System.out.println(search(key, a, 0, a.length-1));

    

【问题讨论】:

【参考方案1】:
    public static int search(int key, int [] a, int lo, int hi)
    
        int n = a.length;

        if (hi > lo)
        
            int mid = lo + (hi - lo) / 2;
            if ((mid == n-1 || key < a[mid+1]) && a[mid] == key)
                return mid;
            else if (key < a[mid])
                return search(key, a, lo, (mid-1));
            else return search(key, a, (mid+1), hi);

         else if(hi == lo && n == hi) 
            return -1*(lo);
         else if(lo > hi) 
            return -1;
        
        return -1*(lo-1);
    

我添加了两个条件:

    hi==lo &amp;&amp; hi == n表示数组的最大值小于key且search()返回最高索引时-(i) 当lo &gt; hi表示数组的最小值大于key且search()返回-1时

并编辑了之前未满足的所有其他条件 return -1*(lo-1);lo == hihi != n 然后返回前一个索引(i)

【讨论】:

工作就像一个魅力!而且你的解释很全面。非常感谢您的帮助!

以上是关于二进制搜索程序未打印正确的索引的主要内容,如果未能解决你的问题,请参考以下文章

未找到打印搜索的问题

如何在 int 数组中查找元素的索引?

如何在字符串数组上使用二进制搜索

构建电子 linux 发行版:找到了 SUID 沙箱助手二进制文件,但未正确配置

为啥我的二进制到十进制转换器程序中只有前 2 个输出正确?

React-Native 我不断收到“您的二进制文件未针对 iPhone 5 进行优化”,但我有正确的图像?