二分查找的思路与实现
二分查找实现说明
一、基本概念
二分查找(Binary Search) 是一种在有序数组中查找特定元素的高效算法。
核心思想:每次将查找范围缩小一半,通过比较中间元素与目标值来决定下一步查找的方向。
二、算法前提
-
数据结构必须有序(升序或降序)
-
通常用于数组这样的随机访问数据结构
-
数据量较大时优势明显
-
在步长不同的列表中(1,4,7,12,32,57...),算法依旧可以正常运行
三、时间复杂度
二分查找的时间复杂度相较于线性查找非常低
-
最优:O(1) - 第一次就找到
-
平均/最坏:O(log n) - 每次将搜索范围减半
四、算法实现(以升序为例)
假设我现在有一个有序列表(升序)List,我现在要从这个列表中查找出3所在位置的索引值
| List | 1 | 3 | 5 | 7 | 9 | 11 | 13 |
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
思路:
-
我们取最左边的数为left(List[0]),最右边的数right([-1])和中间的数字mid((left + right) // 2),得出left为1,right为13,mid为7
List 1 3 5 7 9 11 13 索引 0 1 2 3 4 5 6 变量取值 left 目标 mid right -
我们将mid的值“7”与目标数字“3”的值进行比较,发现mid的值比目标的值大,那么可以断定目标数字一定在mid的左边
-
根据上面得到的消息,我们把left,right和mid的值重新设定一下。因为目标一定在mid的左边,所以我们把right移动到mid的位置,mid重新取值(四舍五入是2)。但是我们发现,mid在之前已经比较过了,为了更加高效地查找,一个将mid的值设定成left-1(四舍五入是1)
List 1 3 5 7 9 11 13 索引 0 1 2 3 4 5 6 变量与取值 left mid right -
接下来我们再次将mid和目标值进行比较,发现mid=目标=3。接下来,我们只需要获取到mid的值就可以获得到目标数字所在列表的索引值
结果:一个长度为7的列表,只用了2次搜索就查找到了目标值所在的索引值
注:此为示例,一切请以实际情况为准!
-
五、源代码示例
以下是用Python搭建的函数,如果与你的编程语言不同也没有关系,逻辑和思路是相同的
def binary_search(li:list = None,val:int = None,sequence:str = "S") -> int:
"""
二分查找[O(logn)]
列表需排序,不需要创建实例
默认正序列表查找(S)
参数:
li : 列表
val : 目标值
sequence : 列表顺序
正序搜索: S(Sure);倒序搜索: O(Opposite)
返回:
val所在li中的索引值,如果未找到返回None
"""
left = 0 # 设定left的值
right = len(li) - 1 # 设定right的值
while left <= right: #一直匹配,直到left小于等于right(搜索完成)
mid = (left + right) // 2 # 设定mid的值
if li[mid] == val: # 如果找到了(mid=val)
return(mid)
if sequence.upper() == "S": # 否为正序搜索
if li[mid] > val: # val在mid的左边
right = mid - 1
else: # val在mid的右边
left = mid + 1
elif sequence.upper() == "O": #是否为倒序搜索,下面的代码思路同上,不过是反过来
if li[mid] > val:
left = mid + 1
else:
right = mid - 1
else:
return(None)
return(None) # 未找到,退出循环
完整的代码在我的GitHub上,欢迎大家下载查看。里面包含了其他算法可供大家学习参考!TOYI-Wise/PY_List_Algorithm

浙公网安备 33010602011771号