スポンサーリンク
バイナリーサーチ(二分探索)
まずは、下記のように、ソート・ユニークされた配列を対象にします。
int arr[MAX] = {1,3,5,6,7,9,10,11,22};
バイナリーサーチは、サーチ対象の中央を起点として、
右半分・左半分どちらにあるかを判定して、サーチ対象の位置を絞り込んでいきます。
leftとrightを下記のように初期値を定義して、
int left = 0; int right = MAX - 1;
targetが、右半分・左半分どちらに位置するかをループ処理していきます。
targetが、leftとrightが隣り合うまでループ処理しすると、
leftかrightのどちらかにtargetが存在することになります。
while(left + 1 != right){ middle = (left + right) / 2; if(arr[middle] == target){ return middle + 1; }else if(target < arr[middle]){ right = middle; }else{ left = middle; } }
途中でtargetが見つかればreturnし、最後までループ処理したら、
leftかright、targetがある方をreturnします。
targetがなければ-1をリターンしています。
※targetは0以上の整数としています。
if(arr[left] == target){ return left +1; }else if(arr[right] == target){ return right + 1; } return -1;
スポンサーリンク
サンプルコード
下記がサンプルコードになります。
$ cat sample.c #include <stdio.h> #define MAX (9) int arr[MAX] = {1,3,5,6,7,9,10,11,22}; int binarySearch(int target){ int left = 0; int right = MAX - 1; int middle; while(left + 1 != right){ middle = (left + right) / 2; if(arr[middle] == target){ return middle + 1; }else if(target < arr[middle]){ right = middle; }else{ left = middle; } } if(arr[left] == target){ return left +1; }else if(arr[right] == target){ return right + 1; } return -1; } int main(){ printf("%d\n", binarySearch(2)); printf("%d\n", binarySearch(80)); printf("%d\n", binarySearch(10)); printf("%d\n", binarySearch(3)); printf("%d\n", binarySearch(22)); printf("%d\n", binarySearch(10)); printf("%d\n", binarySearch(11)); printf("%d\n", binarySearch(1)); return 0; }
下記が実行結果になります。
$ gcc -o sample sample.c $ ./sample -1 -1 7 2 9 7 8 1
スポンサーリンク