Java Двоичный поиск

335
07 октября 2017, 18:33

Задание: Создать массив случайных чисел, отсортировать его по убыванию, а затем провести двоичный поиск числа в данном массиве. Число вводит пользователь с клавиатуры.

Проблема где-то в двоичном поиске, прошу помочь и объяснить ошибку.

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    Random rand = new Random();
    int arr[] = new int[20];
    for (int i = 0; i < arr.length; i++) {   //Заполнение массива
        arr[i] = rand.nextInt(50);
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
    System.out.println();
    for (int i = 0; i < arr.length - 1; i++) {
        for (int j = arr.length - 2; j >= i; j--) {     //Cортировка по убыванию
            if (arr[j] < arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    for (int j = 0; j < arr.length; j++) {  //Вывод отсортированого массива
        System.out.print(arr[j] + " ");
    }
    System.out.println();
    System.out.println("Введите число для поиска");
    int search = s.nextInt();        
    int nX = -1;
    int L = 0;
    int R = arr.length - 1;
    for (int j = 0; j < arr.length; j++) {
        while (L <= R) {
            int k = (L + R) / 2;
            if (k == search) {
                nX = k;
                break;
            }
            else if (k < search) {
                R = k - 1;
            }
            else if (k > search) {
                L = k + 1;
            }
        }
    }
    if (nX == -1) {
        System.out.println("Искомого числа нет в массиве");
    } else {
        System.out.println("Искомое число было найдено и равно " + nX);
    }
}

}

Answer 1

Ошибок куча

  1. Зачем нужен этот цикл?

    for (int j = 0; j < arr.length; j++) {
    
  2. Из этого

    int k = (L + R) / 2;
    if (k == search) {
    

k - индекс текущего проверяемого числа. И сравнивается с самим числом. Бред.

3.

break

Вышли из while цикла for продолжает крутиться

Итого, должно быть, что-то типа такого

int nX = -1;
int L = 0;
int R = arr.length - 1;
while (L <= R) {
    int k = (L + R) / 2;
    if (arr[k] == search) {
        nX = arr[k];
        break;
    }
    else if (arr[k] < search) {
        R = k - 1;
    }
    else if (arr[k] > search) {
        L = k + 1;
    }
}
if (nX == -1) {
    System.out.println("Искомого числа нет в массиве");
} else {
    System.out.println("Искомое число было найдено и равно " + nX);
}

Адекватность проверки if (nX == -1) оставляю на Вашей совести. Я бы не был бы так уверен, что в массиве не встретится -1

Эта строка

System.out.println("Искомое число было найдено и равно " + nX);

легко заменяется на такую

System.out.println("Искомое число было найдено и равно " + search);

Может логичнее выводить индекс найденного числа?

READ ALSO
Убрать горизонтальный scroll в tree primefaces

Убрать горизонтальный scroll в tree primefaces

Не получается убрать горизонтальный скрол

213
Функция Лапласа в C# [требует правки]

Функция Лапласа в C# [требует правки]

Помогите, очень нужна функция Лапласа - она же функция ошибок, она же erf()

388
Пытаюсь подключиться к БД-ке через консоль, но здесь застрял

Пытаюсь подключиться к БД-ке через консоль, но здесь застрял

Здравствуйте! Пытаюсь подключиться к БД-ке через консоль(это сервер здесь), но здесь не знаю как делать дальше, застрял Клиент через серверный...

218
Определение изменения активного окна

Определение изменения активного окна

Необходимо реализовать запись логов событий активного приложения в формате: "Имя нашего приложения" - событие "Стороннее приложение" - просто...

218