最优时间复杂度: O(1)
最坏时间复杂度: O(logn)
递归实现:
#利用递归实现的二分查找
def binarySearch(dataList,data,start,end):
#在dataList的start,end之间查找数据data的坐标
print("查找范围:---" + str(start) + ":" + str(end))
if start>end:
print("元素不在此列表中")
return
if start==end :
if dataList[start]==data:
print("已经找到该元素,坐标为:" + str(start))
else:
print("元素不在此列表中")
return
if end-start==1:
if dataList[start]==data:
print("已经找到该元素,坐标为:" + str(start))
elif dataList[end]==data:
print("已经找到该元素,坐标为:" + str(start))
else:
print("元素不在列表中")
return
mid = (start+end)//2
if dataList[mid] == data:
print("已经找到该元素,坐标为:" + str(mid))
return
elif dataList[mid] > data:
binarySearch(dataList,data,start,mid)
else:
binarySearch(dataList,data,mid,end)
dataList = [1,2,3,4,5,6,7,8,9,10,11,23,23,24,32,45,89,99,100,101,101,102,234,245,290]
len(dataList)
binarySearch(dataList,299,0,24)
非递归实现:
#非递归实现二分查找
def binarySearchNor(dataList,item):
"""
:param dataList: 有序序列
:param item: 要查找的元素值
:return: 元素坐标值,返回-1表示没有找到该元素
"""
if len(dataList) == 1:
if dataList[0] == item:
return 0
else:
print -1
return
#当序列长度大于1,可进行二分查找
start = 0
end = len(dataList)-1
while start < end :
mid = (start+end)//2
#当start和end只相差1的时候,mid=start,此时退出循环
if mid == start:
break
if dataList[mid] == item:
return mid
elif dataList[mid] > item:
end = mid
else:
start = mid
if dataList[start] == item:
return start
elif dataList[end] == item:
return end
else:
return -1
dataList = [1,2,3,4,5,6,7,8,9,10,11,23,23,24,32,45,89,99,100,101,101,102,234,245,290]
print(binarySearchNor(dataList,7))
print(binarySearchNor(dataList,11))
print(binarySearchNor(dataList,999))
print(binarySearchNor(dataList,1))
print(binarySearchNor(dataList,-1))