搜索是指查找一个数列中一个元素是否存在
二分查找(折半查找)
条件:
① 要求处理的数列是经过排序的,
② 操作对象支持下标索引,也就是说元素要连续,那么也就是只能处理顺序表
算法过程:
一,将游标定位到中间位置,判断目标数字T与当前的数字(N)的大小,如果T大于N,则向右查找,反之,向左迭代查找
时间复杂度:
最坏情况:O(log(n))[对半查找,2x=n]
最优情况:O(1)[要找的数刚好在中间]
def binary_search(alist,item):
'''alist为从小到大排的有序数列'''
n=len(alist)
if n<=0:
return False
mid=n//2
if alist[mid]<item:
return binary_search(alist[mid+1:],item)
elif alist[mid]>item:
return binary_search(alist[:mid],item)
else:
return True
# return False
def binary_search2(alist,item):
head=0
rear=len(alist)-1
while head<=rear:
mid=(head+rear)//2
if alist[mid]==item:
return True
elif alist[mid]>item:
rear=mid-1
# rear-=1,这里要注意
else:
head=mid+1
# head+=1
return False
def binary_search1(alist,num,left,right):
'''自创的,可行'''
if left>right:
return False
mid=(left+right)//2
if num<alist[mid]:
right=mid-1
return binary_search1(alist,num,left,right)
elif num==alist[mid]:
return True
else:
left=mid+1
return binary_search1(alist,num,left,right)