折半查找/二分查找算法
给出一个list和一个元素,判断出list中是否存在该元素
浅短理解:
折半查找算法是对于有序的序列而言的,每次查找后折半,大概缩短了一半的查找区间,是一种效率较高的查找算法。
要求:
list必须是顺序结构,且按照关键词大小进行有序排列。
思路:
在有序序列中查找元素,每次取序列中间的元素,如果与要查找元素相等,程序结束;
如果查找元素大于中间元素,则取中间元素后面的序列再进行如上的查找;
如果查找元素小于中间元素,则取中间元素前面的序列再进行如上的查找;
直到找到元素相等,查找成功,或者序列为空,查找失败,程序结束。
python版本:Python2.7.5
# _*_ encoding:utf-8 _*_
def binary_search(lists, key, left, right):
'''
lists:有序序列/list
key:要查找的元素
left:查找的起始位置
right:查找的结束位置 -方便使用递归
return:返回查找元素下标
'''
# 查找的起始位置大于等于结束位置,查找失败程序结束
if left >= right:
return None
mid = (right - left) // 2 + left # 折半,中间元素下标
if lists[mid] > key:
# 中间元素大于查找元素,则查找前半序列
return binary_search(lists, key, left, mid - 1)
elif lists[mid] < key:
# 中间元素小于查找元素,则查找后半序列
return binary_search(lists, key, mid + 1, right)
else:
# 中间元素等于查找元素,程序结束返回下标
return mid
if __name__ == '__main__':
lt = [3,7,10,11,20,33,36,40,88]
index = binary_search(lt, 33, 0, len(lt))
print u'元素位置:{}'.format(index) if index else u'没有找到该元素'
运行结果
文章中有不足之处请多多指教,欢迎讨论,共同学习,共同进步