2016-09-21 30 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

@Martin Sugioarto多くのありがとう!問題が解決しました! – Ryan