二分查找
一:二分查找的递归实现:
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好。
缺点是要求待查表为有序表
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
二分查找的工作原理如下:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功。
否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为
二分查找的前提是表示有序列表“
分析:
二分递归查找实现:
def my_search(alist,item): n=len(alist) # 递归结束条件 if n>0: # 折半查找 mid=n//2 if alist[mid]==item: return True elif item < alist[mid]: # 继续递归查找 return my_search(alist[:mid],item) else: return my_search(alist[mid+1],item) return False if __name__=="__main__": li = [17, 20, 26, 31, 44, 54, 55, 77, 93] print(my_search(li,20))
--------------------------------------------------------------
# 二分查找 递归实现返回目标值索引
new_lst = [0, 1, 3, 11, 12, 34, 45, 56, 78, 90, 99, 124, 678, 789]
def erfen(item, lst, start=None, end=None):
start = start if start else 0
end = end if end else int(len(lst) - 1)
middle=(start+end)//2
while start<=end:
if item>lst[middle]: # 右边
return erfen(item,lst,middle+1,end)
elif item<lst[middle]: # 左边
return erfen(item,lst,start,middle-1)
else: # 就是这个中间值 索引
return middle
return '元素不存在...'
ress=erfen(789,new_lst)
print(ress)
二:二分查找的非递归实现
代码实现:返回对应元素的索引
def my_search2(alist,item): n=len(alist) # 起始位置 ,0 first=0 # 结束位置 last=n-1 while first<=last: #折半 mid=(first+last)//2 # 判断中间的元素 if alist[mid]==item: return True elif item<alist[mid]: last=mid-1 else: first=mid+1 return False if __name__=='__main__': # 二分必须是有序的列表 li=[17, 20, 26, 31, 44, 54, 55, 77, 93] print(my_search2(li,20))
-----------------------------------------------------------------
# 非递归实现二分查找,返回对应目标值的索引
new_lst=[0, 1, 3, 11, 12, 34, 45, 56, 78, 90, 99, 124, 678, 789]
def erfen(item,lst):
length=len(new_lst)
# 起始位置
start=0
end=length-1
while start<end:
middle_num=(start+end)//2
if lst[middle_num]>item: # 在列表左边
end=middle_num-1
elif lst[middle_num]<item: # 在列表右边
star=middle_num+1
else: # 就是这个中间值
return middle_num
return 'no result'
res=erfen(3,new_lst)
print(res)
小知识点:
if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;(相当于一个程序的入口)
当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
普通人!