目录
1、概述
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
2、代码实现
(1)递归实现
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@Author : charleiy
@DateTime : 2024-07-01 22:59:43
@Desc : None
"""
def binary_search(data, item):
"""递归: 二分查找,找到返回对应角标, 找不到返回None"""
if len(data) > 0:
mid = len(data) // 2
if item < data[mid]:
return binary_search(data[:mid], item)
elif item > data[mid]:
return binary_search(data[mid:],item) + mid
else:
return mid
return None
def main():
data = [1,2,4,6,8,9]
print(binary_search(data, 9))
print(binary_search(data, 5))
return None
if __name__ == '__main__':
main()
(2)非递归实现
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@Author : charleiy
@DateTime : 2024-07-01 22:59:43
@Desc : None
"""
def binary_search(data, item):
"""非递归:二分查找,找到返回对应角标, 找不到返回None"""
n = len(data)
first = 0
last = n - 1
while first <= last:
mid = (first + last) // 2
if item == data[mid]:
return mid
elif item < data[mid]:
last = mid -1
elif item > data[mid]:
first = mid + 1
return None
def main():
data = [1,2,4,6,8,9]
print(binary_search(data, 9))
print(binary_search(data, 5))
return None
if __name__ == '__main__':
main()