二分查找的条件:

1.列表是有序的

2.掐头去尾去中间

第一种(最普通的方式):

lst = [1, 4, 5, 7, 12, 15, 16, 23, 35, 56]
n = 5
left = 0
right = len(lst) - 1
middle = 0
while left <= right:#如果,left==right了,证明左右两边重叠了,如果有这个值,就是left==right时,如果没有那么,直接跳出循环走后面的else就可以了middle = (left + right) // 2if lst[middle] > n:#如果中间值的值,大于想要查找的值,那么想要的值在左侧,所以把右边的right要向左移动。#移动到哪呢?中间值,都比n大,所以移动到middle的左边right=middle-1right = middle - 1elif lst[middle] < n:#中间值小于n,那么n就在右侧,所以向右移动left,移动到哪呢?中间值都小于n,所以left= middle+1left = middle + 1else:print('找到了')break
else:print('没有啊')

第二种(递归):这种方式是,改变列表的长度,所以在使用二分查找时,要知道什么是可以变的,什么是不可以改变的。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def func(n, lst):left = 0right = len(lst) - 1if lst != []:mid = (left + right)//2if n > lst[mid]:func(n, lst[mid+1:]) # 改变列表elif n < lst[mid]:func(n, lst[:mid])# 改变列表else:print("找到了")returnelse:print("没找到")returnn = int(input("请输入你要查找的数:"))
func(n, [1,3,5,7,12,36,68,79]) # 78

第三种(递归+函数返回索引):

def func(n, lst, left, right): # 递归找到什么是可以变的. 什么是不可以变的if left <= right:mid = (left + right) // 2if n > lst[mid]:left = mid + 1return func(n, lst, left, right)elif n < lst[mid]:right = mid - 1return func(n, lst, left, right) # 递归如果有返回值. 所有调用递归的地方必须写returnelse:print("找到了")return mid  # 难点else:print("找不到")return -1n = int(input("请输入你要查找的数:"))
lst = [1,3,55,98,37,41,2,5,1,4]
ret = func(n, lst, 0, len(lst)-1) # 78
print(ret)

说一下,第三种的返回值的问题。因为,调用一次函数,就会在内存中,为这个函数生成一个局部命名空间。返回值,只会返还给调用它的地方,所以需要一层一层的往上返回。这样开始的地方才可以接收到相应的索引。

这也是一种查找对应数字的方式,相对来说,这种方式是比较省时省空间的。

lst = [1, 4, 5, 7, 12, 15, 16, 23, 35, 56,34, 22]#列表无序也没关系
new_lst = []
for i in range(57):#找到列表中最大的值,然后给一个新的列表赋值,而且设置为0new_lst.append(0)for i in lst:#把需要查找的列表中的每个数字当做所以,并且给对应的索引设置的值为1new_lst[i] = 1n = 12 #次数如果比new_lst的长度还大,直接返回,没有这个数就可以了
if new_lst[n] == 1:#把n当做索引取出值,看看里面的值是不是等于1,等于1时,证明n在这个列表里,否则就不在这个列表里print('在呢')
else:print('不在')

Python二分查找的三种思路相关推荐

  1. python求平方根的三种方法

    python求平方根的三种方法 题干描述 题目解答 题干描述 没啥好说的qwq,求根号下x,并舍弃小数部分,只保留整数 题目解答 方法一:不多bb,直接0.5次方(这应该是最没有营养的解法,面试官估计 ...

  2. 【Python问题】Python 导入模块的三种方式ModuleNotFoundError: No module named ‘模块名‘

    Python 导入模块的三种方式ModuleNotFoundError: No module named '模块名' 问题 一.Python解释器查找模块文件的过程. 二.解决方法 记录一下 大家可以 ...

  3. Python实现阶乘的三种解法

    Python实现阶乘的三种解法 问题描述 输入一个正整数n,输出n!的值. 其中n!=123*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来 ...

  4. python二分查找

    python二分查找的相关代码 二分查找 二分查找 二分查找是非常基本的算法题,一定要能熟练写出 def myBinarySearch(arr,target):##边界检查if len(arr) &l ...

  5. Python 发送 email 的三种方式

    Python发送email的三种方式,分别为使用登录邮件服务器.使用smtp服务.调用sendmail命令来发送三种方法 本文原文自米扑博客:Python 发送 email 的三种方式 Python发 ...

  6. 测试Python下载图片的三种方法

    简 介: 通过Python软件包对网络URL图片链接进行下载,可以加快后期处理.本文测试了urllib, request两个软件包对图片进行下载效果.如果图片原网页有了防止下载机制,是无法下载图片. ...

  7. python学习音频-详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  8. python可以播放音乐吗_详解python播放音频的三种方法

    第一种 使用pygame模块 pygame.mixer.init() pygame.mixer.music.load(self.wav_file) pygame.mixer.music.set_vol ...

  9. python如何安装matplotlib_详解python安装matplotlib库三种失败情况

    (可能只有最后一句命令有用,可能全篇都没用) (小白方法,可能只适用于本人情况) 安装matplotlib时,出现的三种失败情况 1.read timed out 一开始我在pycharm终端使用pi ...

最新文章

  1. 使用Python,OpenCV读取视频的每一帧,修改后写入视频
  2. 区块链技术特点之去中心化特性
  3. [BZOJ4756] [Usaco2017 Jan]Promotion Counting(线段树合并)
  4. [云炬创业基础笔记]第二章创业者测试23
  5. 8s pod 查看 的yaml_Kubernetes入门到实战(五)深入浅出详解Pod
  6. 医学图像处理期末复习(三)
  7. 【一针见血】 JavaScript this
  8. 飞鸽传书2011比飞鸽传书2007的进化
  9. java创建线程池几种方式_Java 创建线程池两种不同方法的比较
  10. 搭建个人论坛网站图文教程
  11. 远程下载pdf文件 java代码
  12. 安卓如何隐藏root
  13. Linux下播放器开发-交叉编译Mplayer
  14. 完美实现无限饿了么分销的方法——无感预先生成绑定渠道ID
  15. 智能客服选型产品选型比较:晓多、奇智、春松客服
  16. linux 开机运行命令
  17. 商品房销售价格指数中的同比,环比,定基
  18. I am a lazy bone
  19. PostgreSQL的ON CONFLICT
  20. 古玩文物字画寄售系统源码/拍卖商城系统源码/竞拍系统源码转拍系统

热门文章

  1. XcodeGhost风波过后,苹果如何防范风险?
  2. 从安全视角来看LXD容器管理程序
  3. ios升级注:来着微信平台
  4. apachebench ab.exe压力测试
  5. Netsclaer配置
  6. 10个奇幻的HTML5和Javascript效果
  7. 380v pcb 接线端子_插拔式PCB接线端子选型参考
  8. 自由自在公司冰淇淋甜美的健康文化
  9. 【学习笔记】JS基础语法一小时通
  10. SAP 与 JSON 接口实施案例二