2013-06-15 5 views
0

У меня есть список учеников, и я хотел бы отсортировать их по фамилии. Список студент выглядит как это:Бинарный поиск - ошибка

Amanda 
Dorris 
Tucker 
Yasmin 
Zara 

Я хотел бы использовать бинарный поиск подход к поиску с помощью этих студентов и выхода желаемого результата.

Это то, что я до сих пор:

public void binarySearch(String keyword) { 

    int output; 

    if (fileSorted == false) { 
     System.out.println("The file " + fileName + " is not sorted. Please wait while it gets sorted..."); 
     bubbleSort(); 
     System.out.println("Thank you for your patience."); 
     System.out.println(); 
     System.out.print("Search for: "); 
     keyword = elmo.nextLine(); 
     output = doBinarySearch(keyword); 
    } else { 
     output = doBinarySearch(keyword); 
    } 
    System.out.println(output); 
} 

public int doBinarySearch(String keyword) { 

    int start = 0; 
    int end = numStudents - 1; 
    int mid; 
    int result; 

    while (start < end) { 
     mid = start + (end - start)/2; 
     result = students[mid].returnLastName().compareToIgnoreCase(keyword); 

     if (result == 0) { 
      return mid; 
     } else if ((end - start) <= 1) { 
      return -1; 
     } else if (result > 0) { 
      start = mid; 
     } else if (result < 0) { 
      end = mid; 
     } 
    } 
    return -1; 
} 
+0

Что происходит, что вы не ожидаете? Другими словами, в чем конкретно проблема? –

+0

System.out.println (выход); не дает мне выход. программа умирает :( – elmer

+0

Что означает «программа умирает»? Обычно вы получаете сообщение об исключительной ситуации с ценной информацией. – SJuan76

ответ

2

Линия

mid = ((end - start)/2); 

неправильно. Вам нужно установить mid на (примерно) серединой start и end, так

mid = start + (end - start)/2; 

или

mid = (end + start)/2; 

, если вы не боитесь переполнения.

С тем, что у вас есть, mid всегда находится в первой половине массива.

Кроме того, у вас есть случаи

} else if (result > 0) { 
     start = mid; 
    } else if (result < 0) { 
     end = mid; 
    } 

неправильно.

result = students[mid].returnLastName().compareToIgnoreCase(keyword); 

возвращает положительное число, когда фамилия students[mid] лексикографически больше keyword, так, то вам нужно изменить end, не start.

+0

Интересно. Я исправил среднюю ошибку. Что я делаю, чтобы исправить свои дела? – elmer

+0

Просто поменяйте местами сравнения. Вы также можете использовать 'mid-1' и' mid + 1', 'else if (result <0) {start = mid + 1; } else {end = mid-1; } ', поскольку вы знаете, что' mid' не является правильным индексом. –

+0

И вместо 'if (end-start <= 1)', вы должны использовать 'if (end <= start)'. Если 'end == start + 1',' mid' устанавливается в 'start', и если' end' является совпадением, вы никогда не пробуйте это с тестом, который у вас есть сейчас. –

0

Вместо того, чтобы использовать неравенство в вашем состоянии контура - while (start != end) - использовать while (start < end). This is the typical approach. Когда вы проверяете на равенство, вы делаете предположение, что start и end изменяются только по одному на каждой итерации, и это необязательно может быть истинным.

+0

Легко понять, что данные сортируются в 'bubbleSort', если они не были помечены как ранее отсортированные' fileSorted'. Мы не хотим, чтобы здесь было несколько сотен строк кода. Я согласен, что 'while (start SJuan76

+0

Я согласен и отредактировал свой ответ. Меня просто беспокоит то, что происходит с данными befo он получает метод поиска. – lealand

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