3-2-基础算法-查找算法1-列表查找以及二分查找
#########################################################
""" 一、列表查找 1、列表查找:从列表中查找指定元素 输入:列表、待查找元素 输出:元素下标或未查找到元素 2、顺序查找:从列表第一个元素开始,顺序进行搜索,直到找到为止。 返回找到的那个索引 3、二分查找:从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。 二分查找:时间复杂度是O(logn) 二分查找的前提:列表是有序的 切片的复杂读是O(n) #因为切的时候是赋值的 """
################## 二分查找 #######################
# 二分查找, # 优点是比较次数少,查找速度快,平均性能好 # 其缺点是要求待查表为有序表,且插入删除困难 # 适用于不经常变动而查找频繁的有序列表 # 如果判断是中间位置,计算公式是下标之和除以2, # 代码逻辑,最好的办法是使用递归实现, # 第一种方式,使用递归来实现 def binary_search(alist, item): n= len(alist) mid = n //2 if n>0: if alist[mid] == item: # 如果找的数字和中间值一样,就直接返回true了, return True elif item <alist[mid]: # 如果查找到的数字比中间值小,就对左边的子表进行递归, return binary_search(alist[:mid],item) else: # 如果查找到的数字比中间值大 ,就对右边的子表进行递归, return binary_search(alist[mid+1:], item) return False # 如果递归结束了,还没有找到就是没有这个内容, # 第二种方式非递归方式, def binary_search2(alist, item): n=len(alist) 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__': testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,] print(binary_search(testlist, 3)) print(binary_search(testlist, 19)) print(binary_search2(testlist, 3)) print(binary_search2(testlist, 19))
############################################
############################################
############################################
技术改变命运