Моя цель - ввести ключ и массив, а затем вывести количество значений в этом массиве, которые меньше или равны ключу, используя двоичный поиск.Бесконечный цикл в бинарном варианте поиска (Java)
Это мой код:
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;
}
}
С ключом данных = 5, массив = {2,4,6,7}, программа работает нормально. Но в тот момент есть три значения, которые меньше или равны ключу, он идет с haywire. Например, key = 5, array = {2,4,5,6} создает бесконечный цикл. Я нашел причину этого, но я не вижу, как обойти это.
В основном значение mid
продолжает рассчитываться как одно и то же значение. Что я могу сделать, чтобы обойти это? Если код по своей сути ошибочен, значит, the set solution for a USACO problem был неправильным.
Создайте основную версию с помощью тестовых примеров. Не заставляй нас это делать. – nicomp