>> 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言語入門トップに戻る