Python算法之二分查找
二分查找就是每次都取中间值,来对要查找的值进行对比,不断缩小范围的过程。
例如:
我们利用一个猜数字的小游戏来举例,我们心里想一个范围是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算法之二分查找相关推荐
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- 数据结构与算法:二分查找
二分查找是搜索算法中的一种,用来搜索有序数组 二分查找: 是一种简单算法,其输入是一个有序的元素列表(必须有序的原因稍后解释).如果要 查找的元素包含在列表中,二分查找返回其位置:否则返回null. ...
- list 查找_趣味图解算法之二分查找
大多数程序员在看到"算法"两字的时候,是不是头大如斗.但如果想去大公司发展,在面试时又绕不过算法这座大山.市面上好多讲解算法的书籍(如算法导论)基本上都太学术.太复杂,对初学者很不 ...
- 算法简介——二分查找,时间复杂度,空间复杂度
文章目录 前言 二分查找 时间复杂度 大O表示法 空间复杂度 小结 前言 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略 ...
- javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...
- java二分查找法_java算法之二分查找法的实例详解
java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...
- 查找算法:二分查找、顺序查找
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...
- 算法总结-二分查找算法
二分查找也称折半查找(Binary Search),是一种效率较高的查找方法.该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.如果一个序列是无序的或者是链表,那么该序列就不能使用二 ...
- 经典算法之二分查找法(俗称基本二分搜索法)
经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...
最新文章
- 【组队学习】【32期】算法的应用
- MFC底层窗口的实现
- Spring_hibernate整合初步 based in annotation
- BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
- phpstorm—下载安装配置教程
- notepad拼心形_bat心形代码
- Java代码总结【1】_查询手机号码归属地
- 身家4400亿美元的他,吃低于3美元的早餐,和2个老婆同居28年!
- 苏州大学文正学院计算机专业,苏州大学文正学院有哪些专业及什么专业好
- Android笔记 ANR Application Not Response
- for bat utf
- torch 深度学习(3)
- HDU-5876 Sparse Graph
- 如何改变“只收藏不阅读”的习惯
- mongodb,Mysql,redis基础教程
- Redis 设计与实现
- webservice的wsdl文件怎么生成
- 网络安全扫盲贴 史上最全网络安全问题解答
- Hi3559AV100移植友方4G模块N720V5(二)
- 微信改微信号连接服务器,微信修改不了微信号怎么回事 微信号怎么修改