二分查找的思路与实现

二分查找实现说明

一、基本概念

二分查找(Binary Search) 是一种在有序数组中查找特定元素的高效算法。

核心思想:每次将查找范围缩小一半,通过比较中间元素与目标值来决定下一步查找的方向。


二、算法前提

  1. 数据结构必须有序(升序或降序)

  2. 通常用于数组这样的随机访问数据结构

  3. 数据量较大时优势明显

  4. 步长不同的列表中(1,4,7,12,32,57...),算法依旧可以正常运行


三、时间复杂度

二分查找的时间复杂度相较于线性查找非常低

  • 最优:O(1) - 第一次就找到

  • 平均/最坏:O(log n) - 每次将搜索范围减半


四、算法实现(以升序为例)

假设我现在有一个有序列表(升序)List,我现在要从这个列表中查找出3所在位置的索引值

List135791113
索引0123456

思路:

  1. 我们取最左边的数为left(List[0]),最右边的数right([-1])和中间的数字mid((left + right) // 2),得出left为1,right为13,mid为7

    List135791113
    索引0123456
    变量取值left目标midright
  2. 我们将mid的值“7”与目标数字“3”的值进行比较,发现mid的值比目标的值大,那么可以断定目标数字一定在mid的左边

  3. 根据上面得到的消息,我们把leftrightmid的值重新设定一下。因为目标一定在mid的左边,所以我们把right移动到mid的位置,mid重新取值(四舍五入是2)。但是我们发现,mid在之前已经比较过了,为了更加高效地查找,一个将mid的值设定成left-1(四舍五入是1)

    List135791113
    索引0123456
    变量与取值leftmidright
  4. 接下来我们再次将mid和目标值进行比较,发现mid=目标=3。接下来,我们只需要获取到mid的值就可以获得到目标数字所在列表的索引值

结果:一个长度为7的列表,只用了2次搜索就查找到了目标值所在的索引值

注:此为示例,一切请以实际情况为准!


  1. 五、源代码示例

以下是用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

posted @ 2026-02-04 01:16  TOYI-Wise  阅读(2)  评论(0)    收藏  举报