C:为什么我的二进制搜索会遇到无限循环?

时间:2011-05-02 05:23:55

标签: c infinite-loop binary-search

我有一个程序使用二进制搜索搜索文件(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 %s\n", 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", &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", &search);

        if (search == -1)
            break;

       low = 0;
        high = max_count;

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

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

         }

         if (low == high) {
         printf("Not found\n");
         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找到 找不到

2 个答案:

答案 0 :(得分:4)

  1. 如果低&gt;你应该打破未找到高。
  2. 如果找到,你不会破坏,所以你去另一次迭代。
  3. 你总是检查中间。如果高或低有所需的结果怎么办?

答案 1 :(得分:1)

以下代码:

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

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

     }

不退出循环。弄清楚你需要做些什么才能摆脱它。