>> C言語入門トップに戻る
今回は二分探索について説明します。
二分探索とは、前もってソートされた配列の中から、
中央の値と目的の値を比較して、目的の値が前方にあるのか後方にあるのかを判断して
検索していく方法です。
最初に中央の値と比較して、前方か後方かだけへの検索を繰り返していくので、
一つ一つ見て行く線形探索より高速です。
下記のコードを見てください。
これを実行すると「見つかりました」と表示されます。
まず中央値を調べるために、添字の最小値と最大値を足して2で割り、中央の添字を求めてます。
この値とまず一致するか調べ、一致しなければ、目的値が中央値より大きいのか小さいのか調べます。
目的値の方が大きければ添字の最小値を中央値の添字より1つ上に設定します。
逆に目的値の方が小さければ添字の最大値を中央値の添字より1つ下に設定します。
次のループで、最小値・最大値が更新されてるので、次の新しい中央値を求められるというわけです。
もし目的の値がなければ、最小値が最大値以上になるか、最大値が最小値以下になるかのどちらかになるので、
その場合はループを終了します。
毎回その最大値or最大値を更新してるところがポイントですね。
以上が二分探索の説明になります。
次回は線形リストについて説明します。
>> 【線形リスト】に進む
>> C言語入門トップに戻る
二分探索
二分探索とは、前もってソートされた配列の中から、
中央の値と目的の値を比較して、目的の値が前方にあるのか後方にあるのかを判断して
検索していく方法です。
最初に中央の値と比較して、前方か後方かだけへの検索を繰り返していくので、
一つ一つ見て行く線形探索より高速です。
下記のコードを見てください。
#include <stdio.h>
//目的値
#define FIGURE 7
int main(void)
{
//前もってソートしておく
int test[10]={1,2,3,4,5,6,7,8,9,10};
//配列の要素数を取得
int number=sizeof(test)/sizeof(int);
//最小の添字
int min=0;
//最大の添字
int max=number-1;
//中央の要素番号
int mid;
//最大値と最小値が一致するまでループ
while(min<=max){
mid=(min+max)/2;
//まず一致するか比較
if(test[mid]==FIGURE){
printf("見つかりました\n");
return 0;
}else if(test[mid]<FIGURE){
//目的値が中央値よりも上なら、最小値を中央値の一つ上に設定
min=mid+1;
}else if(test[mid]>FIGURE){
//目的値が中央値よりも下なら、最大値を中央値の一つ下に設定
max=mid-1;
}
}
printf("見つかりませんでした\n");
return 0;
}
これを実行すると「見つかりました」と表示されます。
まず中央値を調べるために、添字の最小値と最大値を足して2で割り、中央の添字を求めてます。
この値とまず一致するか調べ、一致しなければ、目的値が中央値より大きいのか小さいのか調べます。
目的値の方が大きければ添字の最小値を中央値の添字より1つ上に設定します。
逆に目的値の方が小さければ添字の最大値を中央値の添字より1つ下に設定します。
次のループで、最小値・最大値が更新されてるので、次の新しい中央値を求められるというわけです。
もし目的の値がなければ、最小値が最大値以上になるか、最大値が最小値以下になるかのどちらかになるので、
その場合はループを終了します。
毎回その最大値or最大値を更新してるところがポイントですね。
以上が二分探索の説明になります。
次回は線形リストについて説明します。
>> 【線形リスト】に進む
>> C言語入門トップに戻る













