在计算机科学中,二分查找算法(英语:binary search algorithm),也称折半搜索算法(英语:half-interval search algorithm)、对数搜索算法(英语:logarithmic search algorithm),是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
相当于问“将多少个10相乘的结果为100”。答案是两个:10 × 10 = 100。因此, = 2。对数运算是幂运算的逆运算。
使用大O表示法讨论运行时间时,
log指的都是。使用简单查找法查找元素时,在最糟情况下需要查看每个元素。因此,如果列表包含8个数字,你最多需要检查8个数字。而使用二分查找时,最多需要检查个元素。如果列表包含8个元素,你最多需要检查3个元素,因为 = 3。如果列表包含1024个元素,你最多需要检查10个元素,因为 = 10。
Python 代码
def binary_search(list, item):
low = 0
high = len(list) - 1
while low <= high:
mid = (low + high) / 2
guess = list[mid]
if guess == item:
return mid
if guess > item:
high = mid - 1
else:
low = mid + 1
return None
my_list = [1, 3, 5, 7, 9]
print binary_search(my_list, 3) # => 1
print binary_search(my_list, -1) # => None
JavaScript 代码
var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15, 19, 20];
function binarySearch (arr, val) {
var low = 0,
high = arr.length - 1;
while (low <= high) {
var mid = parseInt( (low + high) / 2 );
if (val === arr[mid]) {
return mid;
}else if (val > arr[mid]) {
low = mid + 1;
}else if (val < arr[mid]) {
high = mid - 1;
}
}
return -1;
};
console.log( binarySearch(arr, 5) );
Ruby 代码
def binarySearch(arr, value)
low = 0
high = arr.length - 1
while low <= high
mid = (low + high) / 2
if arr[mid] == value
return mid
elsif arr[mid] < value
low = mid + 1
else
high = mid - 1
end
end
return -1
end
arr1 = [1,2,3,4,5,6,7,8]
p binarySearch(arr1, 2)