二分查找

🎉摘要:Python 是一门解释型、面向对象、动态类型的高级编程语言,由荷兰程序员 Guido van Rossum 于 1991 年发布,核心设计理念是优雅、明确、简单。

二分查找(Binary Search),也叫折半查找,是一种高效的查找算法,专门用于在有序数组中快速定位目标元素。

二分查找的核心思想为每次都把查找范围缩小一半,直到找到目标,或确定目标不存在。

二分查找的前提条件如下:

(1)数组必须是有序的(升序或降序)。

(2)数组支持随机访问(比如 Python 列表、数组)。

注意:无序数组不能用二分查找!必须先排序


举一个例子:想象你在猜 1~100 的数字

(1)你先猜中间数 50;

(2)如果目标比 50 大,就直接排除 1~50,只看 51~100;

(3)再猜新范围的中间数,重复这个过程;

(4)最多 7 次就能找到答案。

这就是二分查找!每次砍掉一半范围。


假如你有一个有序数组 [2, 5, 8, 12, 15, 20, 25, 28, 30],使用二分查找算法查找目标 25,过程如下:

第一步:

数组下标: 0   1   2    3    4    5    6    7    8
数组元素:[2,  5,  8,  12,  15,  20,  25,  28,  30]
          ↑                 ↑                   ↑
          |                 |                   |
      左边界 left        中间 mid           右边界 right
        (low=0)       (mid=4,值=15)          (high=8)

第一步:15 < 25 → 目标在右半区 → left = mid + 1 = 5

第二步:

下标:     0   1   2    3    4    5    6    7    8
元素:     [2,  5,  8,  12,  15, 20,  25,  28,  30]
                                 ↑    ↑         ↑
                                 |    |         |
                                left  mid      high
                                 (5)  (6)      (8)

第二步:25 == 25 → 找到!返回下标 6


示例代码:

def binary_search(arr, target):
    """二分查找算法实现,返回目标元素的索引,如果不存在则返回 -1"""
    # 左边界、右边界初始化
    left = 0
    right = len(arr) - 1

    while left <= right:
        # 计算中间索引(防止溢出写法:left + (right - left) // 2)
        mid = (left + right) // 2
        
        # 找到目标,返回索引
        if arr[mid] == target:
            return mid
        # 目标在右半部分
        elif arr[mid] < target:
            left = mid + 1
        # 目标在左半部分
        else:
            right = mid - 1

    # 循环结束没找到
    return -1


if __name__ == "__main__":
    # 有序数组
    nums = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
    # 目标元素
    target_num = 23

    # 二分查找
    result = binary_search(nums, target_num)
    if result != -1:
        print(f"元素 {target_num} 在数组中的索引为: {result}")
    else:
        print("元素不在数组中")

运行结果:

元素 23 在数组中的索引为: 5

  



说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号