二进制搜索变量中的无限循环(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;
}