2013-09-25 3 views
0

У меня проблема с бинарным поиском.Двоичный поиск в Java с использованием массива поля имени объекта

Он работает в первый раз, но если пользователь выбирает эту опцию из меню, она не работает для курорта не в массиве, а иногда и не работает вообще. Я не могу понять, почему он не работает. Я читал разные темы здесь, чтобы попытаться понять это, но я в тупике.

EDIT: Я думаю, что у меня это работает. я вынул всю часть кода и переписал его на той лишь разницей, глядя на конечный результат является скобки в случае, если другое заявление

    if (resorts[middle].getName().compareTo(getDataFor) > 0) 
        { 
         high = middle - 1; 
        } 
        else if (resorts[middle].getName().compareTo(getDataFor) < 0) 
        { 
         low = middle + 1; 
        } 
        else 
        { 
         resorts[middle].display(); 
         found = true; 
        } 

Спасибо за помощь!

else if (choice == '2') 
     { 
      found = false; 
      while (!found) 
      {  
       System.out.print("Which resort would you like data for?: "); 
       getDataFor = kb.nextLine().toUpperCase(); 
       low = 0; 
       high = resorts.length; 
       while (low <= high && !found) 
       { 
        middle = (high + low)/2; 
        if (resorts[middle].getName().compareTo(getDataFor) > 0) 
         high = middle - 1; 
        else if (resorts[middle].getName().compareTo(getDataFor) < 0) 
         low = middle + 1; 
        else 
        { 
         resorts[middle].display(); 
         found = true; 
        } 
       } 
       if (!found) 
        System.out.println("Resort not found, please try again."); 
      } 
     } 
+0

Вы уверены, что массив отсортирован перед использованием двоичного поиска? –

+0

Что значит «не работает»? Какое поведение вы видите? –

+0

массив отсортирован. не работает, либо говорит, что не может найти курорт, когда он находится в массиве, или я вхожу в курорт, который я ищу, и нажимаю кнопку ввода, но оттуда ничего не происходит и говорит, что программа все еще работает – user2817309

ответ

0

Вы должны инициализировать low в -1, не равны нулю, и на каждом неигровые установить low или high к middle без добавления или вычитания ничего.

Визуализируйте low и high как указывающие на записи, которые уже были проверены и не могли быть совпадающими. Вы запускаете оба элемента «вне» массива. Когда middle окажется несовместимым, он заменяет low или high как внешнюю границу записей, которые не могут совпадать.

Или вы могли бы написать код с low и high представляющий «внутри границ» диапазона кандидата, в этом случае ваш middle-1 и middle+1 будет правильным, и начальные условия будут low=0 и high=length-1.

Вы можете выбрать любую визуализацию, но ваши исходные условия (low и high) не соответствуют друг другу.

+0

Я пробовал оба эти решения и, похоже, не сработали. Первое предложение, которое я вхожу в курорт, который я ищу, и он просто запускается и никогда ничего не делает, второе решение будет находить только среднее значение, но нет. – user2817309

+0

Вам нужно либо выполнить код в отладчике, либо вставить debug регистрируя заявления, чтобы следить за тем, что происходит. Распечатайте 'high',' low' и 'middle' на каждой итерации. Затем проблема должна стать очевидной. –

Смежные вопросы