【问题标题】:C: Why does my binary search run into an infinite loop?C: 为什么我的二分查找会陷入死循环?
【发布时间】:2011-05-02 05:23:55
【问题描述】:

我有一个程序,它使用二进制搜索搜索文件 (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
没找到

【问题讨论】:

    标签: c infinite-loop binary-search


    【解决方案1】:
    1. 如果低 > 高,您应该使用 not found 来打破。
    2. 如果你找到了,你不会破坏,所以你会去另一个迭代。
    3. 你总是检查中间。如果高或低有需要的结果怎么办?

    【讨论】:

    • 哇哦。我修复了所有这些条件的搜索并且它有效。非常感谢!
    【解决方案2】:

    以下代码:

       while (1) {
             middle = (low + high) / 2;
    
         if (data[middle] == search) {
         printf("Found at index %d\n", middle);
    
         }
    

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

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 2023-03-22
      • 2016-04-08
      • 2020-07-13
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多