2016-09-21 2 views
1

Я пытаюсь реализовать двоичный поиск несколько нетрадиционным способом, используя только 3 аргумента int value (то, что я ищу), int values ​​[] (массив), int n (размер массива). Код ниже находит номер 2 и признает, что 13 не существует, но не может найти числа, такие как 6 или 7. Я думаю, что проблема заключается в окончательном рекурсивном вызове. Это может быть проблема с указателем. Я уверен, что остальная часть кода работает нормально. Любые мысли о том, где я, возможно, ошибаюсь, будут оценены.Binary Search Seg Fault

#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

Я уверен, что я следую, поскольку значения - это имя массива. Добавление величины 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