c - While Loop 永远运行并且不在二分查找中返回

标签 c binary-search

尝试为反向数组输入实现二进制算法。 当我执行测试用例时 - 5 4 3 2 1 它向我显示一个空白屏幕,即 while 循环无限运行。现在尝试调试它一段时间但无法弄清楚我哪里出错了。

#include <stdio.h>
#include <stdlib.h>

int findright(int arr[], int key, int low, int high);

void main() {
  int n, i, arr[200], key;
  scanf("%d %d\n", &n, &key);
  for (int i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
  }
  int a = findright(arr, key, 1, n - 1);
  printf("%d", a);
}

int findright(int arr[], int key, int low, int high) {

  int mid = (low + high) / 2;
  while (low <= high) {
    if (arr[mid] == key) {
      return mid;
    } else if (arr[mid] > key) {
      findright(arr, key, mid + 1, high);
    } else {
      findright(arr, key, low, mid - 1);
    }
  }
  return -1;
}

最佳答案

在你的循环中 while (low <= high) { ... , low 的值和 high没有改变;因此,如果循环一旦进入,它将永远不会返回。

当你使用递归时,你将不需要循环:

int findright(int arr[], int key, int low, int high) {

  if (low > high) { // anchor stopping recursion
    return -1;  // indicate that key was not found...
  }

  int mid = (low + high) / 2;
  if (arr[mid] == key) {
      return mid;
  } else if (arr[mid] > key) {
      return findright(arr, key, mid + 1, high);
  } else {
      return findright(arr, key, low, mid - 1);
  }
}

Demo.

请进一步注意,正如 MFisherKDX 所提到的,“您的 main 中也有一个差一错误。您将 1 作为低值传递,因此永远不会检查第 0 个元素”。

关于c - While Loop 永远运行并且不在二分查找中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49740573/

相关文章:

c++ - 使用 C 中的 Windows API 隐藏文件或目录

c++ - 没有对话框的编辑控件上的 SHAutoComplete

c++ - 如果使用 unordered_set,O(NLogN) 显示出比 O(N) 更好的性能

c++ - 离散二分查找

c - sigtimedwait 和检测信号

c++ - 证明两个代码块在功能上是相同的?

java - 二分查找。打印出与目标进行比较的元素?

performance - 用 D 语言比较两个内存块的最有效方法是什么?

使用二分搜索检查排序的非顺序数组是否有重复项?

c - 逐行读取文件,它只存储文件中的最后一行