C:为什么我的二分查找会陷入死循环?

标签 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
没找到

最佳答案

  1. 如果 low > high,你应该打破 not found。
  2. 如果找到就不会中断,因此您会进行另一次迭代。
  3. 你总是检查中间。如果高或低有所需的结果怎么办?

关于C:为什么我的二分查找会陷入死循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5853705/

相关文章:

c - C中的 "passing argument 2 of strcmp makes pointer from integer without a cast"错误是什么意思?

c - 为什么 C 中的 IPPROTO_DIVERT 经过几次测试后就停止工作了?

java - 为什么此二进制搜索代码在 Eclipse IDE 上给出错误的输出?

有人可以解释为什么它不会执行我的二分搜索中的最后一个 else if 语句吗

c - GCC 生成的程序集等同于 C 中的 continue 语句

java - 防止java中的无限循环

c++ - 在 Linux 上的 C++ 无限循环中捕获内存不足的错误 bad_alloc()

javascript - setTimeout 导致无限 while 循环

rust - 二进制搜索大块向量

c# - 如何将 pinvoke 用于指向 C# 的 C 结构数组指针