バイナリーサーチ(二分探索とも呼ばれる)はソート済みの配列において、検索する間隔を半分に分割しながらデータを探し出すアルゴリズムです。
ソート済みの配列を分割するということはバイナリーサーチツリーを生成することになります。
検索範囲の分割はデータの大小関係をもとに行われます。
バイナリーサーチは値の比較によって検索範囲を絞りこむので、探索対象の配列がソートされていなければなりません。
配列から目的の値を検索するバイナリーサーチのサンプルコードです。
#include <stdio.h>
#define ARRAY_SIZE 7 /* size of array */
int main(void)
{
int a[ARRAY_SIZE] = {1,2,3,4,5,6,7}; /* sorted array */
int left = 0; /* start key of index */
int right = ARRAY_SIZE; /* end key of index */
int mid; /* middle key of index */
int value; /* search value */
puts("Find value?");
scanf("%d", &value);
while(left <= right) {
mid = (left + right) / 2; /* calc of middle key */
if (a[mid] == value) {
puts("Found!\n");
return 0;
} else if (a[mid] < value) {
left = mid + 1; /* adjustment of left(start) key */
} else {
right = mid - 1; /* adjustment of right(end) key */
}
}
puts("Not Found.\n");
return 0;
}
def binary_search(l, value):
low = 0
high = len(l) - 1
while low <= high:
mid = (low + high) // 2
if l[mid] == value:
print('Found')
return True
elif l[mid] < value:
low = mid + 1
else:
high = mid - 1
print('Not Found')
return False
#
# main
#
if __name__ == '__main__':
import sys
l = xrange(20)
for num in l:
assert binary_search(l, num)
assert binary_search(l, -50) == False
assert binary_search(l, -50) == False
assert binary_search(l, 20) == False
assert binary_search(l, 19) == True
assert binary_search(l, 0) == True
assert binary_search([1,2,4,12,67,90], 3) == False