スポンサーリンク

バイナリーサーチ(二分探索)

まずは、下記のように、ソート・ユニークされた配列を対象にします。

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

スポンサーリンク