菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python 二分查找

Document 对象参考手册 Python3 实例

二分搜索是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

实例 : 递归

# 返回 x 在 arr 中的索引,如果不存在返回 -1defbinarySearch(arr, l, r, x): # 基本判断ifr >= l: mid = int(l + (r - l)/2)# 元素整好的中间位置ifarr[mid] == x: returnmid# 元素小于中间位置的元素,只需要再比较左边的元素elifarr[mid] > x: returnbinarySearch(arr, l, mid-1, x)# 元素大于中间位置的元素,只需要再比较右边的元素else: returnbinarySearch(arr, mid+1, r, x)else: # 不存在return -1# 测试数组arr = [2, 3, 4, 10, 40]x = 10# 函数调用result = binarySearch(arr, 0, len(arr)-1, x)ifresult != -1: print("元素在数组中的索引为 %d" % result)else: print("元素不在数组中")

执行以上代码输出结果为:

元素在数组中的索引为 3

Document 对象参考手册 Python3 实例

AI 思考中...

4 篇笔记 写笔记

  1. #0

    小花花

    124***[email protected]

    14
    '''二分查找有序不重复数组
    BinarySearch(unfinished).py'''
    # 未完成版
    def BinarySearch(sortedlist):
     num = int(input('Number:\t'))
     counter = 0 # 记录循环次数
     mid = 0 # 记录中间位置
     if num in [sortedlist[0], sortedlist[len(sortedlist) - 1]]: # 切割时取不到首尾
     print('Find it at beginning or end.')
     else:
     while True: # 切割数组
     mid = len(sortedlist) // 2
     if sortedlist[mid] == num:
     print('Find number {}.'.format(num))
     break
     elif sortedlist[mid] > num:
     sortedlist = sortedlist[:(mid + 1)]
     else:
     sortedlist = sortedlist[mid:]
     print(sortedlist, mid)
     counter += 1
     if counter > len(sortedlist) + 1: # 超过迭代次数即停止
     print('Don\'t find it.')
     break
    sortedlist = [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
    BinarySearch(sortedlist)

    小花花

    124***[email protected]

    7年前 (2019年07月13日)
  2. #0

    叫爸爸

    506***[email protected]

    55

    该算法的要求:

    • 1、必须采用顺序存储结构。
    • 2、必须按关键字大小有序排列。
    def bin_search(data_list, val): 
     low = 0 # 最小数下标 
     high = len(data_list) - 1 # 最大数下标 
     while low <= high: 
     mid = (low + high) // 2 # 中间数下标 
     if data_list[mid] == val: # 如果中间数下标等于val, 返回 
     return mid 
     elif data_list[mid] > val: # 如果val在中间数左边, 移动high下标 
     high = mid - 1 
     else: # 如果val在中间数右边, 移动low下标 
     low = mid + 1 
     return # val不存在, 返回None
    ret = bin_search(list(range(1, 10)), 3)
    print(ret)

    叫爸爸

    506***[email protected]

    7年前 (2020年01月09日)
  3. #0

    ccneko

    ccn***@163.com

    8

    补充个增序或者减序都能用的版本:

    # 二分查找(非递归版本)
    # isAsc为True时,列表增序,否则减序
    def binarySearch(sortedList, key, isAsc=True):
     left = 0 # 查找范围最左边的下标
     right = len(sortedList) - 1 # 查找范围最右边的下标
     while left <= right: #
     mid = left + right >> 1 # 中间数下标(向下取整)
     if isAsc and sortedList[mid] < key \
     or not isAsc and sortedList[mid] > key: # key在中间数右边时,查找范围变为右边
     left = mid + 1
     elif isAsc and sortedList[mid] > key \
     or not isAsc and sortedList[mid] < key: # key在中间数左边时,查找范围变为左边
     right = mid - 1
     else:
     return mid # key为中间数时,返回其下标
     return -1

    ccneko

    ccn***@163.com

    6年前 (2020年02月26日)
  4. #0

    东坡弃疾

    158***[email protected]

    11

    有序不重复数组,二分查找,非递归算法:

    def binaryserch(a,x):
     mid = tempmid =len(a) // 2 #mid 用于记录数组a的中间数,tempid 用于记录原始数组中mid的值
     while len(a) > 1:
     if a[mid] > x:
     a = a[:mid]
     mid = len(a) // 2 
     tempmid = tempmid - (len(a) - mid) 
     elif a[mid] < x:
     a = a[mid+1:]
     mid = len(a) // 2 
     tempmid = tempmid + mid +1
     else:
     break 
     if len(a) == 1:
     tempmid = tempmid if a[mid]== x else -1 
     if len(a) < 1:
     tempmid = -1 
     
     return tempmid

    东坡弃疾

    158***[email protected]

    6年前 (2020年07月21日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /