二分查找是一种在有序数组中查找某一个特定元素的搜索方法,需要注意,一定得是有序数组。
二分查找算法会先从数组的中间元素开始查找,如果中间元素恰好是要查找的元素,则搜索过程结束;如果不是,则比较该中间元素与要查找的元素,如果中间元素大于了要被查找的元素,则在数组中小于中间元素的部分进行查找;反之则在数组中大于中间元素的部分进行查找。
首先我们可以给出数组的初始位置,结束位置和中间位置:
begin = 0
end = len(list) - 1
mid = (begin + end) / 2
Python语言的第一索引位置是0,因此,数组最后一个元素的索引位置为 数组长度-1。
如果猜的数字小了,我们则可以修改low的数值:
low = mid + 1
反过来,如果猜的数字打了,我们则可以修改high的数值:
high = mid - 1
然后我们可以对这个过程进行循环,直到得到结果:
binary_search(list, item):
#python的索引位置从0开始
begin = 0
#python的数组的最后一个元素的索引位置为数组长度-1
end = len(list) - 1
#如果范围没有被缩减到只有一个元素,则继续运行
while begin <= end:
#首先,从数组的中间元素开始
#因为python 3.x 开始将不再自动向下取整,而是保留浮点数,所以需要使用int()函数
mid = int((begin + end) / 2)
guess = list[mid]
#如果中间元素恰好是需要被索引的元素
if guess == item:
return mid
#如果中间元素大于了需要被索引的元素
if guess > item:
end = mid - 1
#如果中间元素小于了需要被索引的元素
else:
begin = mid + 1
#如果需要被索引的元素不在数组里面
return None
listOne = [1,2,3,4,5,6,7,8,9,10]
print (binary_search(listOne, 8))def binary_search(list, item):
#python的索引位置从0开始
begin = 0
#python的数组的最后一个元素的索引位置为数组长度-1
end = len(list) - 1
#如果范围没有被缩减到只有一个元素,则继续运行
while begin <= end:
#首先,从数组的中间元素开始
mid = (begin + end) / 2
guess = list[mid]
#如果中间元素恰好是需要被索引的元素
if guess == item:
return mid
#如果中间元素大于了需要被索引的元素
if guess > item:
end = mid - 1
#如果中间元素小于了需要被索引的元素
else:
begin = mid + 1
#如果需要被索引的元素不在数组里面
return None
我们可以来进行测试:
listOne = [1,2,3,4,5,6,7,8,9,10]
print (binary_search(listOne, 8))
得到结果为:
7
因为Python是的索引位置是从0开始,所以是7,而不是8。
如果有一个列表含有一个n个元素并且该列表是一个有序列表,那么使用二分法查找在其中查找一个名字,需要的最多步骤为:
log(2)nlog(2)n
如果是一个128个元素的有序列表,那么采用二分查找法来在其中查找一个名字所需的最多步骤为7步。