python 数据结构与算法 day06 二分查找
1. 二分查找
又称折半查找,把要查找的元素跟序列中中间位置的元素进行比较,如果比中间位置元素小,就从序列的左半部分查找,反之,从序列的右半部分查找,对折半后的序列再按照类似比较中间元素折半的方法查找;
二分查找要求序列是支持索引的,所以也就是作用对象是顺序表,然后要求原始的序列必须是有序的;
2. 代码实现
2.1 递归版本:
def binary_search(L,item): """二分查找(递归)""" n=len(L) mid=n//2 # 所查找的序列的中间位置索引 while n>0: if item<L[mid]: return binary_search(L[:mid],item) elif item>L[mid]: return binary_search(L[mid+1:],item) else: return True return False L=[1,4,7,9,23,56,78,89] print(binary_search(L,56)) # 二分查找要求作用的对象是有序的数组(顺序表--支持索引)
2.2 非递归版本
def binary_search(L,item): """二分查找,非递归版本""" n=len(L) first=0 last=n-1 while first<=last: mid = (first + last) // 2 # 中间位置的元素 if item<L[mid]: last=mid-1 elif item>L[mid]: first=mid+1 else: return True return False L=[1,4,7,9,23,56,78,89] print(binary_search(L,56))
3. 时间复杂度
二分查找最优时间复杂度:O(1);
最坏时间复杂度: O(log(n)----因为需要对长度为n的序列每次折半查找,直至最终只有一个元素 整个折半的过程经历了2^k=n 也就是k=log(n))
相比一般的遍历,最优时间复杂度也是O(1) 但是最坏时间复杂度却是O(n);
talk is cheap,show me the code