程序员须掌握的数据结构:二分查找python代码实现
二分查找,时间复杂度O(logn),排序一次,查找多次,排序成本可以忽略;只查找一次,则顺序查找比较好。非递归12行,递归10行。
# 源码: https://github.com/SpikeKing/data_structure_with_python
def binary_search(alist, item):
"""
二分查找,非递归
1. 2个参数,待查找alist和查找项item
2. 声明2个变量,first,last
3. while条件,first小于等于last
4. mid是first和last的中值(整除);
5. 三个if条件,相等alist[mid]=item,小于中值换last,大于中值换first;
6. 默认返回False,12行
:param alist: 待查找alist
:param item: 待查找项item
:return: 是否找到
"""
first = 0
last = len(alist) - 1
while first <= last:
mid = (first + last) // 2
if alist[mid] == item:
return True
else:
if alist[mid] > item:
last = mid - 1
else:
first = mid + 1
return False
def binary_search_re(alist, item):
"""
二分查找,递归
1. if终止条件,长度为0,返回False;
2. 中点是长度除2,中值判断;
3. 小于递归前半部分,大于递归后半部分,返回递归函数;
4. 10行
:param alist: 待查找alist
:param item: 待查找项item
:return: 是否找到
"""
if len(alist) == 0:
return False
mid = len(alist) // 2
if alist[mid] == item:
return True
else:
if alist[mid] > item:
return binary_search_re(alist[:mid], item)
else:
return binary_search_re(alist[mid + 1:], item)
def test_of_binary_search():
test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42]
print(binary_search(test_list, 3))
print(binary_search(test_list, 13))
print(binary_search_re(test_list, 3))
print(binary_search_re(test_list, 13))
if __name__ == '__main__':
test_of_binary_search()
作者:SpikeKing
来源:掘金
THE END