二分查找就是每次都取中间值,来对要查找的值进行对比,不断缩小范围的过程。

例如:

我们利用一个猜数字的小游戏来举例,我们心里想一个范围是0~6的整数2,接下来把0~6的数组罗列【0,1,2,3,4,5,6】,二分查找取中间值,最大的是6,最小的是0,那么中间值就是(最小 + 最大)/ 2,就是3,发现大于,那么比3大的数包括3都排除了,那么就可以把最大值缩小成3 - 1,就变成了这样的一个数组【0, 1, 2】。再取中间值1,发现小于,那么1,0排除,数组只有【2】,那么就是2了。这就是相比一个一个找的顺序查找效率高些的二分查找算法了。二分查找只能用于从小到大排列的数组或者是从大到小的,也就是有顺序的数列哦。

接下来我们用一个查找电话号码对应位置的实例来理解一下。

首先我们创建一个列表,电话号码是一个11位的整数,所以我们将其顺序排列。

每一个电话号码对应了一个数字

排列完成后就是这样的:num_list = [13601950623, 13621714000, 15201753079, 17521295718, 19921771195]

num_list[0]也就是第一个电话号码对应数字1,以此类推。

利用二分查找输入电话号码来取得对应的数字,接下来请看代码:

num_list = [17521295718, 15201753079, 13601950623, 13621714000, 19921771195]
numbers = int(input('输入电话号码:'))# 冒泡排序函数,二分查找只能用于有顺序的数列
def bubble_sort():for j in range(len(num_list) - 1):for i in range(len(num_list) - 1 - j):if num_list[i] > num_list[i + 1]:num_list[i], num_list[i + 1] = num_list[i+1], num_list[i]print(num_list)# 二分查找函数
def find(key):# 首先取列表的中间一项,与要查找的数对比# 初始化最大和最小的范围,由于列表第一项为0,所以最大的一项是总数 - 1minimum = 0maximum = len(num_list) - 1# 对比中间一项大于小于或等于要查找的数字while True:# 中间值就是最小的范围加上最大的范围除以2,//代表整除,例如1.5就取1,2.4就取2mid = (minimum + maximum) // 2# 如果大于,那么比这个中间值大的数就排除了,所以将最大的范围值设置成中间值减去1if num_list[mid] > key:maximum = mid - 1# 反之,小于就把最小的范围值设置成中间值加一elif num_list[mid] < key:minimum = mid + 1# 如果等于就把中间值设置成函数的反回值,加上一代表代号是4elif num_list[mid] == key:return mid + 1bubble_sort()
print(find(numbers))

Python算法之二分查找相关推荐

  1. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  2. 数据结构与算法:二分查找

    二分查找是搜索算法中的一种,用来搜索有序数组 二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释).如果要 查找的元素包含在列表中,二分查找返回其位置:否则返回null. ...

  3. list 查找_趣味图解算法之二分查找

    大多数程序员在看到"算法"两字的时候,是不是头大如斗.但如果想去大公司发展,在面试时又绕不过算法这座大山.市面上好多讲解算法的书籍(如算法导论)基本上都太学术.太复杂,对初学者很不 ...

  4. 算法简介——二分查找,时间复杂度,空间复杂度

    文章目录 前言 二分查找 时间复杂度 大O表示法 空间复杂度 小结 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 ...

  5. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  6. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  7. 查找算法:二分查找、顺序查找

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  8. 算法总结-二分查找算法

    二分查找也称折半查找(Binary Search),是一种效率较高的查找方法.该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.如果一个序列是无序的或者是链表,那么该序列就不能使用二 ...

  9. 经典算法之二分查找法(俗称基本二分搜索法)

    经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...

最新文章

  1. 【组队学习】【32期】算法的应用
  2. MFC底层窗口的实现
  3. Spring_hibernate整合初步 based in annotation
  4. BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
  5. phpstorm—下载安装配置教程
  6. notepad拼心形_bat心形代码
  7. Java代码总结【1】_查询手机号码归属地
  8. 身家4400亿美元的他,吃低于3美元的早餐,和2个老婆同居28年!
  9. 苏州大学文正学院计算机专业,苏州大学文正学院有哪些专业及什么专业好
  10. Android笔记 ANR Application Not Response
  11. for bat utf
  12. torch 深度学习(3)
  13. HDU-5876 Sparse Graph
  14. 如何改变“只收藏不阅读”的习惯
  15. mongodb,Mysql,redis基础教程
  16. Redis 设计与实现
  17. webservice的wsdl文件怎么生成
  18. 网络安全扫盲贴 史上最全网络安全问题解答
  19. Hi3559AV100移植友方4G模块N720V5(二)
  20. 微信改微信号连接服务器,微信修改不了微信号怎么回事 微信号怎么修改

热门文章

  1. Python3字符串split()函数的用法
  2. 2022广西省安全员C证理论题库及在线模拟考试
  3. 从OpenBMC porting ACD到AMI codebase下的过程
  4. 小程序数据可视化图表绘制wxcharts
  5. 百元降噪耳机排行榜10强,一加、南卡、索尼等降噪蓝牙耳机推荐
  6. Docker的四种网络模式
  7. 随机过程:齐次泊松过程的定义
  8. 视频教程-企业微信支付JAVA版_向员工收款-微信开发
  9. 忆——2017 International Genetically Engineered Machine Competition
  10. 正确安装外夹式超声波流量计