c - 二进制搜索段错误

标签 c search recursion binary

我试图通过仅使用 3 个参数 int value(我正在寻找的)、int values[](数组)、int n(大小数组)。下面的代码找到数字 2 并识别出 13 不存在,但找不到像 6 或 7 这样的数字。我认为问题出在最后的递归调用中。这可能是一个指针问题。我确定其余代码工作正常。任何关于我可能出错的地方的想法都将不胜感激。

#include <stdio.h>
#include <stdbool.h>

bool search(int value, int values[], int n);

int main(void)
{   
    int value = 6;
    int values[] = {1, 2, 3, 4, 5, 6, 7};
    int n = 7;

    bool x = search(value, values, n);

    if (x == true)
        printf("found\n");
    else
        printf("not found\n");
}

bool search(int value, int values[], int n)
{
    int midpoint = n/2;

    if (n/2 <= 0)
    {
        return false;
    }
    if (value == values[midpoint])
    {
        return true;
    }
    if (value < values[midpoint])
    {
        return search(value, values, n/2);
    }
    else if (value > values[midpoint])
    {
        return search(value, values, n/2);
    }

 return false;
} 

最佳答案

是的,问题是当你用数组的上半部分调用搜索时,你应该像这样用偏移量传递它

return search(value, values + (n + 1) / 2, n / 2);

请注意,当 n 为奇数时,我还跳过了您已经比较过的中间元素。您当然可以优化递归调用,始终注意正确计算长度。

关于c - 二进制搜索段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609298/

相关文章:

java - 如何将 JSON Web 服务索引到 Elasticsearch 中?

ruby-on-rails - Rails 3.1 Ransack HABTM

python - 如何迭代或递归确定二维数组中的邻居?

Javascript:在前缀树中准确找到 10 个以给定前缀开头的单词

c - 直接发送字符串与发送指向字符串的指针给函数有什么区别?

c - 从单链表和双向链表中删除随机节点

android - 如何设置 Android 的 onSearchRequested() 样式;

c - C 中的递归斐波那契

c - 将 2 个数组的和存储到一个简单的 int 变量中

c - 如何将值插入哈希表上的链接列表成员