二分法查找又稱折半查找。二分法查找是在一個有序列表的基礎上完成的,要查找的值x和列表的中間值m作比較,如果x大於m,那么接下來從m+1的右區間內再以相同方法取中間值做判斷,循環往復此過程,直到判斷出x=m的時候就是查找成功。否則相反。返回類型為布爾值
時間復雜度為 O(logn) 空間復雜度:O(1)
兩種實現二分法查找的方法:遞歸、非遞歸 代碼奉上
# 遞歸實現: def binary_seach(alist,item): if len(alist) == 0: return False else: mid = len(alist) // 2 # middle 記錄中間位置索引 if item == alist[mid]: # 如果查找元素與中間位置元素相等 則返回真 return True elif item < alist[mid]: # 如果查找元素小於中間位置元素,則進行列表切片縮小列表范圍 return binary_seach(alist[:mid],item) else: return binary_seach(alist[mid+1:],item) if __name__ == '__main__': alist = [5, 10, 15, 18, 35, 55, 65, 75, 99] print(binary_seach(alist,200)) # 查找列表中不存在的數據 print("__________________") print(binary_seach(alist,15)) # 查找列表中存在的數據
#非遞歸實現: def binary_seach(alist,item): first = 0 # 起始下標為0 last = len(alist) - 1 # 列表最后一位的索引 while first <= last: # 列表中間位置的索引值 mid = (first + last) // 2 if item == alist[mid]: return True elif item < alist[mid]: last = mid -1 else: first = mid + 1 else: return False if __name__ == '__main__': alist = [5,10,15,18,35,55,65,75,99] # 有序序列 print(binary_seach(alist, 200))