Python语言二分法查找

前言

二分就是二分查找,它是一种效率较高的查找方法。

假如你们公司新来了一个人,叫张三,他是你们公司第47个人,过了一段时间后,有些人呢看张三不爽,离职了,那这时候张三肯定不是公司第47个人了,怎么样才知道张三排第几呢,下面我们用二分法把他找出来

 

思路

给你一本1000页的书籍,随机给定一个页码,如何用最快的方式找到它?如果一页一页逐步去查找,则最高需要查找一千次!那我们如何用二分法来解决这个问题呢?二分法的关键就是二分这个词。

 步骤1:设定一个页码作为中心点来将1000页分为两份,中位数的作用就是每次缩小一半查找范围,即达到开方的效果。即可以用 (首位+末位)/2 = 中位数。

 步骤2:将需要查找的页码与中位数比价,如果大于中位数则舍弃对中位数的前一半查找,反之则舍弃对后一半范围查找,达成开方效果。 步骤3:在新的查找范围重新计算出中位数

步骤4:查找页码对比中位数,确定新的查找范围 步骤5:循环以上步骤,直到找到该页码为止

 .......

代码

通过以上思路解析,我们知道了二分法实行步骤,接下来就通过代码来实现步骤,首先是循环实现

#模拟页码
array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107]
#首位值
low = 0
#末位值
height = len(array)-1
#设定查找页码
findNum = 1

#循环查找
while True:
    #获取中位数
    mid = int((low+height)/2)
    #打印中位数,查看循环次数
    print(array[mid])
    #如果中位数小于查找值,则锁定后半段
    if array[mid] < findNum:
        #重置低位数
        low = mid + 1
    #如果中位数大于查找值,则锁定前半段
    elif array[mid] > findNum:
        #重置高位值
        height = mid - 1
    #找到数字则打印该值下标,终止循环
    elif array[mid]==findNum:
        print('find it:',array[mid],' index:',mid)
        break

除了上述方式外,也可以使用递归来实现,代码更加简洁

array = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29, 33, 38, 69,99,107]

#函数递归
#定义一个函数,给三个形参:低位值,高位值,查找值
def BinarySearch(low,height,findNum):
    #计算出中位数
    middle = (low+height)//2
    #如果中位数小于查找值,则锁定后半段
    if findNum >array[middle]:
        #重置低位数
        low = middle +1
    #如果中位数大于查找值,则锁定前半段
    elif findNum<array[middle]:
        #重置高位值
        height = middle - 1
    else:
        #找到该值并返回
        return '该值下标为:%s,值为:%s'%(middle,array[middle])
    #没有找到则调用自身继续查找
    return BinarySearch(low,height,findNum)

print(BinarySearch(array[0],len(array)-1,19))

总结

 

根据结果反馈,使用二分法常规Python检索用循环方式找数字21,他是排在11位,中位数查询3次,使用Python二分法检索递归方式先取查询数字的倍数,然后锁定前半段进行索引,索引的步骤耗时更少

  • 30
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Python二分查找是一种用于在有序列表中查找特定元素的算法。它的基本思想是将列表分成两半,然后确定目标元素位于哪一半中,然后继续在该半中进行查找,直到找到目标元素或确定目标元素不存在。 使用二分法进行Python查找有两种方式:迭代方式和递归方式。 在迭代方式中,我们首先将列表的左边界设为0,右边界设为列表长度减1。然后,我们计算中间元素的索引,并将其与目标元素进行比较。如果中间元素等于目标元素,则找到了目标元素。如果中间元素大于目标元素,则将右边界设为中间元素的索引减1;如果中间元素小于目标元素,则将左边界设为中间元素的索引加1。重复这个过程,直到找到目标元素或确定目标元素不存在。 在递归方式中,我们定义一个函数,将列表的左边界、右边界和目标元素作为参数传递给函数。函数首先计算中间元素的索引,并将其与目标元素进行比较。如果中间元素等于目标元素,则找到了目标元素。如果中间元素大于目标元素,则在左半边递归调用函数;如果中间元素小于目标元素,则在右半边递归调用函数。重复这个过程,直到找到目标元素或确定目标元素不存在。 综上所述,Python二分查找是一种高效的查找算法,可以在有序列表中快速定位目标元素。无论是使用迭代方式还是递归方式,都能够快速找到目标元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python语言二分法查找](https://blog.csdn.net/AI19970205/article/details/123464424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值