二分查找算法:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
二分查找适用范围:
二分查找方法适用于不经常变动而查找频繁的有序列表。
算法前提:
顺序存储结构;
关键字大小有序排列;
查找的数量只能是一个;
实现方式:
递归查找和非递归查找两种实现方式;
算法分析:
假设list列表是一个升序排列的表,查找表中间位置记录的关键字,并且与需要查找关键字比较,如果两者相等,则查找成功,返回中间位置的下标;如不相等,可以中间位置为分界点,如果中间位置记录的关键字大于查找关键字,则查找前一个子表,否则查找后一个子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功,list表中没关键字。
寻找数组的中间值;
获取列表最中间的元素;
进行条件判断,将中间值和被寻找的值进行比较:
相等则返回该值;
如果被寻找的值小于中间值,则最大下标变化为中间值的前一个元素下标;
如果被寻找的值大于中间值,则最小下标变化为中间值的后一个元素下标;
递归查找:
def half_search(list,item,high,low=0):
if low <= high:
mid = int((low + high) // 2)
if list[mid] > item:
return half_search(list,item,high=mid-1,low=low)
elif list[mid] < item:
return half_search(list,item,high=high,low=mid+1)
else:
return mid
return None
my_list = [1,2,3,4,5,6,7,8,9,10,12,14]
h=len(my_list)-1
print(half_search(my_list,8,h,0))
非递归查找:
def binary_search(list,item):
low = 0
high = len(list)-1
while low <= high:
mid = int((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,2,3,4,5,6,7,8,9,10,12,14]
print(binary_search(my_list,7))