2016-09-21 5 views
1

3 개의 인수 int value (내가 찾고있는 것), int values ​​[] (배열), int n을 사용하여 약간 비 전통적인 방식으로 이진 검색을 구현하려고합니다. (배열의 크기). 아래의 코드는 숫자 2를 찾고 13이 없다는 것을 인식하지만 6이나 7과 같은 숫자를 찾을 수 없습니다. 문제는 최종 재귀 호출에 있다고 생각합니다. 포인터 문제 일 수 있습니다. 나머지 코드는 제대로 작동합니다. 내가 잘못 될 수있는 부분에 대한 생각은 인정 될 것이다.바이너리 검색 Seg 오류

#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

@ Martins Sugioarto 많은 감사! 문제 해결됨! – Ryan