新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V6.0版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 1145|回复: 0

[笔记] 7124 - [选修1]Python 二分查找

[复制链接]
发表于 2021-2-18 09:39:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

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

. ^; U# s% g5 @/ N! K Binary_search_into_array.png
! X% c3 Y# h0 g
  1. """
    ( ~) L" V/ Z3 ]7 n
  2. 顺序查找经典案例17 t) [6 f$ Q' Y: L% d' V# S( Q8 u
  3. 素材来自新大榭Python学习社区,帖子号:7124#3 y# ^- N4 K+ k( k. d# K
  4. 首页 http://www.daxie.net.cn/py/
    . R. G9 }  Q- @7 I' n
  5. """5 c  [/ D( E) c! }8 }
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
    : ~- j* s- R& ~: [
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key
    . s% W# D2 x3 m0 A# Z6 x" @
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0
    $ I9 P' Q1 C7 C
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1' `& p+ Z0 z  H6 C' K; [; T( |# b
  10. flag=False #初始化定义没有找到时的值为False4 [/ n. L8 A3 i" C: \% V, \
  11. while L<=R: #左边界小于有边界,即当范围内有数据时7 K2 t! s. }9 p( d5 e+ ^2 L
  12.     m=(L+R)//2 #取中间元素的下标m
    5 r& V4 P# K; \" V5 \/ r, a
  13.     if a[m]==key: #比较中间元素与key,若相等
    # r7 r1 W' V. O: U
  14.         flag=True #满足相等条件,即成功找到元素
      ?7 j- z* j4 T' N6 C8 B. @4 v0 T
  15.         break #结束循环,退出循环
    . j. j& m* v% S' J+ _  H+ \
  16.     if key<a[m]: #如果key比中间元素a[m]小
    4 A2 F% |8 c- G1 h
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)
    9 ~9 T& S8 r' `
  18.     else: #否则(key比中间元素大)
    0 q! g7 M" K8 E# w4 N* ]6 K
  19.         L=m+1 #左边界改为m右边一位的元素
    / P# a  F+ m) r, O$ m& R
  20. if flag==True:
    4 }* n* E# E" \
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
    1 |% n+ h; G" k2 Z9 y# Q; v
  22. else:- d8 K8 c5 ^5 _& g3 `$ ~5 g
  23.     print("查找失败") #未找到的状态,输出查找失败& @/ X5 S- ^' H" X9 R
  24. 3 t* _4 U, u! ?1 f- ?8 @
  25. #【分析思考】
    & G3 e9 n# }1 P3 d: V* n3 j
  26. # 略。。。0 J5 G# M6 y. g; _+ n: O$ G

  27. . {/ G2 [) d8 C9 P& O* P0 g! g, C
  28. """
    3 J' u$ l3 k0 u& w9 X& M
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
    5 ~. z& T$ Q" ]7 `: o, B
  30. """
复制代码

- l( I5 R& ~9 t实例2 : 递归
7 C6 w! x# M1 r# Y" H1 I
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -1) i# T5 u2 {. R
  2. def binarySearch (arr, l, r, x):
    " q, \+ V. ~( w. Z
  3.   % @) v& O6 e0 g. E; {7 R1 h9 y
  4.     # 基本判断; {( @3 V% T, j) Y5 M
  5.     if r >= l: $ F0 Y. g+ t0 H7 K  s6 g. ^
  6.   # K# @3 a. e0 s- U
  7.         mid = int(l + (r - l)/2)# Z8 n4 D; ~( ]& u( Z- r6 T$ }
  8.   
    # @( L: q) T5 I8 o! H
  9.         # 元素整好的中间位置! E* z6 d! ~8 n/ K1 x4 \! j1 m/ |
  10.         if arr[mid] == x:
    , m) }2 V  K$ c1 B) z  e
  11.             return mid
    4 b7 d9 W$ b0 l8 s$ Q8 [- a
  12.          
    * {/ {% }3 X1 x
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素
    3 u3 Z6 P6 i0 N, b
  14.         elif arr[mid] > x:
    # O& j; z2 h! f" B4 f& d& R- }
  15.             return binarySearch(arr, l, mid-1, x) : X. G7 m1 q% Q4 Z' D6 \
  16.   
    * M0 P' p5 ^$ {1 A  Q- D
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素: `3 m, g  X$ t+ y! c+ P2 {
  18.         else:   t2 T: {$ c+ ^8 ~; N& ~, q
  19.             return binarySearch(arr, mid+1, r, x)
    # n' {- ]7 H# K
  20.   # [' q* J0 {* ^; V: y
  21.     else: * I) t; J: T* t4 i
  22.         # 不存在
    : s$ N  ]& t$ {) a, G: ~% ], a" x. ]
  23.         return -1
    / \, `' y3 j0 z' m7 X8 N
  24.   
    - |& Z! m8 K5 E
  25. # 测试数组5 y8 S: ^* v1 b/ u' N& t! a
  26. arr = [ 2, 3, 4, 10, 40 ]
    ) j" z$ x- G* z( t% q9 A, o
  27. x = 10
    " V5 X6 u$ a$ a3 g. r2 V
  28.   2 h( A+ ?( t' B
  29. # 函数调用
    : I$ }; T- R: f1 m% O; c+ E
  30. result = binarySearch(arr, 0, len(arr)-1, x)
    , q) F" C4 C. C3 F
  31.   
    " i% ?! F8 D) G) m
  32. if result != -1:
    3 b' m/ `5 F+ w
  33.     print ("元素在数组中的索引为 %d" % result )# w5 r. ^8 E% y  h
  34. else:
    1 v4 e6 p2 T3 u4 l6 U8 w
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为
# \: l6 p, G" z# f, H' G% {) W
  1. 元素在数组中的索引为 3
复制代码
$ r  ]9 w0 w7 `* z- z4 t1 p  x

+ A; t; b" B- }1 w9 b; _" p3 c
4 d7 P. J, V4 g/ f5 M8 I' G* Q
) F2 d; E( m( g( ?8 d4 I
7 J* ?$ Q6 |; y; q注:log2X+1 = ? 次 (X为序列的总元素数量)

7124-01-01.py

1.23 KB, 下载次数: 71, 下载积分: 财富 -1 点

新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2026-5-23 09:35 , Processed in 0.086999 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表