2016-09-21 88 views
1

我想通过使用只有3个参数int值(我在找什么),int值[](数组),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; 
} 
+2

你需要像'values + n - n/2'(这与'values + n/2'不一样)。 – user3386109

+0

我记下我确定遵循,因为values是数组的名称。增加数量n/2似乎并不合理。尽管如此,我一定会玩弄它。非常感谢您的回复! – Ryan

+3

'if(n/2 <= 0)'错误。 0是一个有效的数组索引。这就是为什么你的代码在数组切片的开始处找不到任何值的原因。 – tofro

回答

3

是的,问题是,当你调用与阵列的上半部分,你都要与胶印一样

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

请注意,我也跳过了中间元素通过它,你已经比较为n单数的情况。您当然可以优化递归调用,始终注意长度的计算也是正确的。

+0

这也有问题。 – deepmax

+0

@Martin Sugioarto非常感谢!问题解决了! – Ryan