算法——二分查找

二分查找

概念

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

代码实现过程

# lists 要查找的列表
# key 要查找的数字
def binarySearch(lists,key):
start = 0 # 起始坐标
end = len(lists)-1 # 结束坐标
while start <= end: # 程序的出口条件
mid = start + (end-start)//2 # 中间坐标
if lists[mid] == key:
return mid
elif lists[mid] > key:
end = mid - 1
else:
start = mid + 1
return -1 # 查找不到数据 就返回-1
lists:[1,2,3,5,7,9]
key:7
return the index:4

lists:[1,2,3,5,7,9]
key:4
return the index:-1

推理过程

在有序列表中,先确定中间值,把列表分为前后两个列表,如果中间值大于要查找的值,则在前列表查找,否则在后列表查找。重复该过程,如果找到该数值,返回下标,找不到则返回-1.

lists = [1,2,3,5,7,9] key= 4
[1,2] [3,] [5,7,9]---------3与4进行比较
[5] [7] [9]---------7与4进行比较
[5]---------5与4进行比较
返回-1

时间复杂度

该折半算法的时间复杂度为 O(logN)

算法的变化

如果要查找的列表中含有重复字符,如何返回第一个匹配的字符下标。如find,index函数。

def binarySearch(lists,key):
    start = 0  # 起始坐标
    end = len(lists)-1  # 结束坐标
    while start < end:  # 程序的出口条件   去了=号  加了=无法退出
        mid = start + (end-start)//2  # 中间坐标
        if lists[mid] >= key: # 改为 >=
            end = mid
        else:
            start = mid + 1
    return   start # 返回的是值,不再是-1  返回end也行

推理过程

lists = [3,3,3,3,3,5,7] key = 3
[3,3,3] [3] [3,5,7]------------3与3比较
[3,3,3,3]
[3,3] [3] [3]------------3与3比较
[3,3,3]
[3][3][3]--------3与3比较
[3][3]--------比较完后 达到退出程序条件 返回下标
返回0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值