STEP 2.2 (二分探索)

問題

実行結果


入力:整数key 
出力:配列sに整数keyがある場合は、インデックスを出力。 ない場合も、その旨、出力


探索キーを入力してください :14
s[0] = 1
s[1] = 3
s[2] = 4
s[3] = 8
s[4] = 13
s[5] = 14
s[6] = 18
s[7] = 20
s[8] = 21
s[9] = 25
14 is found in s[5]

探索キーを入力してください :23
s[0] = 1
s[1] = 3
s[2] = 4
s[3] = 8
s[4] = 13
s[5] = 14
s[6] = 18
s[7] = 20
s[8] = 21
s[9] = 25
The element 23 is not in s

アルゴリズム

基本的な部分 (言葉にして、確認しよう)

  1. low = 0, high = N-1, mid = (low+high)/2 とする。.5は切り捨てる。 (変数の初期化)
  2. low > high なら、終了条件2
  3. S[mid] == Key なら、終了条件1
  4. そうでないとき、Key < S[mid] ならhigh=mid-1、A[mid] < Key ならlow = mid+1 として、2へ

解答例

[プログラム(未完)]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10
int s[N] = {1,3,4,8,13,14,18,20,21,25};

void print_data (void);  /* 配列のプリント */
int binary_search (int); /* 引数はintのキー。 見つけた場合の添え字を戻す。*/

int main(void) {
    int x;
    int i;

    printf("探索キーを入力してください :");
    scanf("%d", &x);

    print_data();

    i = binary_search(x); /* 検索せよ。戻り値をiに代入 */

/* iの値をチェック */
    if (i == -1 ) /* 見つけていない */
        printf("The element %d is not in s\n", x);
    else
        printf("%d is found in s[%d]\n", x,i);


    return 0;
}

void print_data (void) {
    int i;

    for (i = 0; i < N ; i++)
        printf("s[%d] = %d \n", i, s[i]);
}

/* binary_searchを自作しなさい */
int binary_search(int key) {

    int low = 0 ; /* 上側 */
    int high = N - 1; /* 下側 最後の要素(添え字)を初期値に */
    int mid;


   /* 手続き 疑似コードも参考に */

   /* なぞり ←→ アルゴリズムとして言葉で整理 ←→ プログラムコード */
           /*  プログラムツールへ (見たら、かなりヒントになります) */

}