C: Почему мой двоичный поиск переходит в бесконечный цикл?

#c #infinite-loop #binary-search

#c #бесконечный цикл #двоичный поиск

Вопрос:

У меня есть программа, которая выполняет поиск в файле (numbers.dat) с помощью двоичного поиска и выводит, находится ли значение в массиве или нет. В настоящее время, когда я хочу выполнить поиск по первому значению в файле numbers.dat или по значению, которого нет в файле numbers.dat, я получаю бесконечный цикл, и если я хочу выполнить поиск по любому другому значению в файле, он выводит индекс и сообщения «Не найдено».

Вот мой код:

  int main() {
     FILE *in_file; /* Input file */
     int middle;        /* Middle of our search range */
     int low, high; /* Upper/lower bound */
     int search;        /* number to search for */
     char line[80]; /* Input line */

     in_file = fopen(DATA_FILE, "r");
     if (in_file == NULL) {
          fprintf(stderr,"Error:Unable to open %sn", DATA_FILE);
          exit (8);
     }

     /*
      * Read in data
      */

     max_count = 0;
     while (1) {
          if (fgets(line, sizeof(line),  in_file) == NULL)
          break;

          /* convert number */
          sscanf(line, "%d", amp;data[max_count]);
            max_count;
     }

    while (1) {
        printf("Enter number to search for or -1 to quit:" );
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%d", amp;search);

        if (search == -1)
            break;

       low = 0;
        high = max_count;

       while (1) {
             middle = (low   high) / 2;

         if (data[middle] == search) {
         printf("Found at index %dn", middle);

         }

         if (low == high) {
         printf("Not foundn");
         break;
         }

         if (data[middle] < search)
         low = (middle   1);
         else
         high = (middle - 1);
     }
    }
     return (0);
}
  

Первые несколько строк файла numbers.dat:
4
6
14
16
17
И если я ищу 4 или, скажем, 2, я получаю бесконечный цикл, а если я ищу 6, я получаю:

Найдено по индексу 1
Не найдено

Ответ №1:

  1. Вы должны прервать с не найдено, если низкий> высокий.
  2. Вы не прерываетесь, если нашли, поэтому переходите к другой итерации.
  3. Вы всегда проверяете середину. что, если high или low дают необходимый результат?

Комментарии:

1. Ого. Я исправил поиск для всех этих условий, и это сработало. Большое спасибо!

Ответ №2:

Следующий код:

    while (1) {
         middle = (low   high) / 2;

     if (data[middle] == search) {
     printf("Found at index %dn", middle);

     }
  

Не завершает цикл. Выясните, что вам нужно сделать, чтобы выйти из этого.