二分查找及其变体

  二分查找算法是针对有序数据集合的查找算法,也叫折半查找算法:每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0二分查找的最好时间复杂度是O(1),最坏时间复杂度是O(logn),这种对数时间复杂度极其高效,有时甚至比O(1)的算法还要高效。

1.最简单的二分查找法(不含重复的元素)代码实现:

1.1.递归形式

 1 def binary_search(alist, item):
 2     """二分查找---递归版本"""
 3     n = len(alist)
 4     if n > 0:  # 递归终止条件,区间没有元素
 5         mid = n // 2  # 中间位置
 6         if alist[mid] == item:
 7             return True
 8         elif alist[mid] > item:
 9             return binary_search(alist[:mid], item)  # 在新区间内继续查找
10         else:
11             return binary_search(alist[mid+1:], item)  # 在新区间内继续查找
12     return False  # 没有查到元素

1.2.非递归形式

 1 def binary_search(alist, item):
 2     """二分查找---非递归版本"""
 3     n = len(alist)
 4     left, right = 0, n-1
 5     while left <= right:  # 查找控制
 6         mid = left + ((right - left) >> 2)  # >>的优先级比较低
 7         if alist[mid] == item:
 8             return True
 9         elif alist[mid] > item:
10             right = mid - 1
11         else:
12             left = mid + 1
13     return False

2.二分查找法的变体

2.1.

猜你喜欢

转载自www.cnblogs.com/kongzimengzixiaozhuzi/p/12957481.html