二进制搜索变量中的无限循环(Java)

二进制搜索变量中的无限循环(Java),java,arrays,algorithm,infinite-loop,binary-search,Java,Arrays,Algorithm,Infinite Loop,Binary Search,我的目标是输入一个键和一个数组,然后使用二进制搜索输出该数组中小于或等于键的值的数目 这是我的代码: import java.util.*; import java.io.*; public class search { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int key = scan.nextInt(); int

我的目标是输入一个键和一个数组,然后使用二进制搜索输出该数组中小于或等于键的值的数目

这是我的代码:

import java.util.*;
import java.io.*;

public class search {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int key = scan.nextInt();
        int size = scan.nextInt();
        int [] array = new int [size];

        for (int i = 0;i < size ;i++ ) {
            array[i] = scan.nextInt();
        }
        Arrays.sort(array);

        System.out.println(binary(key, array));
    }

    public static int binary (int key, int [] array){
        int lo = 0;
        int hi = array.length - 1;

        while (lo < hi){
            int mid = (lo + hi) / 2;
            if (array[mid] <= key){
                lo = mid;
            }

            else {
                hi = mid - 1;
            }
        }

        return lo + 1;
    }
}
import java.util.*;
导入java.io.*;
公共类搜索{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
int key=scan.nextInt();
int size=scan.nextInt();
int[]数组=新的int[size];
对于(int i=0;i如果(array[mid]您的算法看起来不错。但是我发现为mid赋值有问题

int mid = (hi+lo)/2
想象一个案例,你的

hi=4
mid = 3
现在mid的新值将是(3+4)/2=3(整数除法)

因此,循环将继续运行而不会中断

在这种情况下,您可以通过检查此条件来增加mid的值

但更有效的方法似乎是检查mid的值是否重复,然后打破循环。 最后检查数组[hi]的值是否与数组[mid]的值相同

希望这会有帮助

祝你今天愉快……)

编辑

更好的方法是

将while循环更改为

while(mid<hi+1){
 }

示例解决方案似乎不错。代码的问题是
mid=(lo+hi)/2
lo
取整,这是一个问题,因为更新情况是
lo=mid
hi=mid-1
。当
hi==lo+1
时,在第一种情况下,没有任何进展。您应该像示例一样取整:
mid=(lo+hi+1)/2
(警告:长数组可能溢出;请检查您的约束)


该示例还检查第一个值是否小于键。

在循环中,必须使间隔变小,还必须排除刚才查看的元素。向左时执行此操作,向右时则不执行此操作


您还错过了长度为1的间隔,因为您使用了包含的上下限。您的循环条件应该是
lo使用您的测试用例创建一个main。不要强迫我们这样做。
  mid = (mid+hi+1)/2
static int binary(int key, int[] array)
{
    int lo = 0;
    int hi = array.length - 1;

    while (lo <= hi) {
        int mid = (lo + hi) / 2;

        if (array[mid] <= key) {
            lo = mid + 1;
        } else {
            hi = mid - 1;
        }
    }

    return lo;
}
static int binary(int key, int[] array)
{
    int lo = 0;
    int hi = array.length;

    while (lo < hi) {
        int mid = (lo + hi) / 2;

        if (array[mid] <= key) {
            lo = mid + 1;
        } else {
            hi = mid;
        }
    }

    return lo;
}