2016-05-09 11 views
-3

私はこれを一日中考えようとしていて、それを機能させるように見えません。 なぜ二分探索作業はI手動で入力配列の長さがあれば行いますが、私はのための手動入力を入れ替えるとき:バイナリ検索Int配列サイズの問題

​​

動作するようには思えません。たとえば、1,1,2,3,4,5,6,7,8,9,10の11要素配列で2を検索しようとすると、2を見つけることができません。しかし、int minを変更すると= 11。それは2 をここで見つけることができる機能バイナリ・ソートです:

int binarysearch(int *list, int sfor) 

    int min = 0; 
    int max = 10; 
    int mid = (min + max)/2; 

    while(min <= max) 
    { 
     if (sfor == list[mid]) 
     { 
      printf("The number you are searching for is in %i place \n", mid + 1); 
      return 0; 
     } 
     else if (sfor < list[mid]) 
     { 
      max = mid - 1; 
     } 
     else 
     { 
      min = mid + 1; 
     } 

     mid = (min + max)/2; 
    } 

     printf("Could not find number! \n"); 
     return 1; 



int main(int argc, string argv[]) // number searching for is passed through 
{         // command line argument 

    printf("How many numbers did you want to search through? \n"); 
    int a = GetInt(); //int a is how big should the array of numbers be 
    printf("What are they: \n"); 

    int i = 0; 
    int b[a]; 

    for (i = 0; i < a; i++) 
    { 
     b[i] = GetInt(); //cycles though each int of the array 
    } 

    int x = atoi(argv[1]); //converts command line argument to an int 

    binarysearch(b, x); 
} 

が大幅に任意の助けに感謝します。

+2

'list'はどのように定義されていますか? 'int * list;'? –

+0

コードをデバッグする方法を学びます。 minの値を出力し、それが正しいかどうかをチェックします。 – user31264

+0

私は自分のコードをデバッグするとき、max = 2だが、配列の長さが11ならば、int max = sizeof(list)/ sizeof(list [0]); 2を得る? –

答えて

0

あなたの問題はここにある:

int min = sizeof(list)/sizeof(list[0]); 

(あなたが実際に関数に配列を渡すことができないよう)関数に渡される配列のために動作しないこと。また、配列のサイズを渡す必要があります。

+0

これは「トリック」ではなく、通常の法的表現です。そして、それがうまくいかない理由は、Cの関数に配列を渡すことができないからです。最後の文は間違っています。 – Olaf

+0

@Olafどのように間違っていますか?ある場所に配列を宣言して別の関数に渡すと、実際には行えないので、機能しません。さらに、sizeofが関数ではなくマクロであるため、コンパイル時にサイズが分かっている場合にのみ機能します。 – bodangly

+0

@Olaf私は、私の応答を編集して、トリックという言葉をもっとはっきりさせて削除しました(しかし、私はそれをすることはお勧めしません)。実行時に割り付けるかコンパイルするかにかかわらず、そのサイズはどこかにキャプチャする必要があります。この方法に頼る必要はありません。私はそれがコードの匂いであると言います。) – bodangly

関連する問題