新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1129|回复: 0

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

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

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

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

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

" L- y1 h( K+ f8 r# }/ u3 Y Binary_search_into_array.png * o0 x$ |, i. z" B9 R7 W
  1. """0 C8 F. p) h; ]  h0 k6 ^! E; J
  2. 顺序查找经典案例1
    2 N0 a" x" J* ?5 w
  3. 素材来自新大榭Python学习社区,帖子号:7124#
    0 t, O- }& D, C$ A+ u4 i
  4. 首页 http://www.daxie.net.cn/py/
    - m# p4 F5 m, b
  5. """
    ; m! j+ h# ^8 d4 i! c4 o
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
    3 u' \6 K4 F5 k: p8 J1 g: n! i
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key# B: }7 \3 \  }1 l8 S
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为09 }% |: a; C* L, m" K6 i8 {8 M! K
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
    1 _5 o7 o8 ^5 n& m  N6 C2 f
  10. flag=False #初始化定义没有找到时的值为False
    ; c( Z/ ^  Q: t: q
  11. while L<=R: #左边界小于有边界,即当范围内有数据时6 G- A' `' q" L: a
  12.     m=(L+R)//2 #取中间元素的下标m! m! _" _& G1 E/ F, q8 M
  13.     if a[m]==key: #比较中间元素与key,若相等% _7 s/ h' ~/ [$ n, x4 d, r2 B8 f
  14.         flag=True #满足相等条件,即成功找到元素* O7 i8 o/ {/ @, R; E3 S
  15.         break #结束循环,退出循环
    ( i  H- Q2 q+ D5 p" O9 y" A
  16.     if key<a[m]: #如果key比中间元素a[m]小6 h7 \1 k* z! {; ~& \% g$ u& ~5 W3 v' H
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)) t/ l, N7 |3 K+ @9 U' M
  18.     else: #否则(key比中间元素大)
    4 W( f, I( L, w- C
  19.         L=m+1 #左边界改为m右边一位的元素- L6 Y+ E5 }$ W: \: k
  20. if flag==True:
    # q$ O6 j5 A" Y: f1 u+ }
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
    & X5 j- k: R8 J7 Q2 V
  22. else:7 S( O5 W- H! V
  23.     print("查找失败") #未找到的状态,输出查找失败
    7 |( s+ ^. T3 a' f1 H) \3 h
  24. 4 t9 p7 G" b" ^1 X( [9 h
  25. #【分析思考】
    / n4 t2 F: H, d! }$ I, g
  26. # 略。。。( r$ s% H3 C6 ~7 {! I
  27. / G& A( `2 `: K) g
  28. """
    2 [( w3 b7 D2 W% P5 M$ V
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4: x/ k, b& C4 _" N3 g+ L
  30. """
复制代码

4 n8 u% Q* d% K3 v/ ]* Y实例2 : 递归3 i4 F+ s% p1 @/ [
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -1
    8 \, d- p' ^% t7 g% V- D5 d/ I
  2. def binarySearch (arr, l, r, x):
    # `" H! W; I3 ]4 F! f
  3.   
    $ m, I0 \) }) I% `) p0 z  T
  4.     # 基本判断
    8 b0 [4 j8 y4 T
  5.     if r >= l:
    / _' C: [7 _6 A
  6.   
    $ r& ?( q. q+ O7 _6 e
  7.         mid = int(l + (r - l)/2)
    $ o( d, g' g# a0 x% l& g$ {
  8.   
    0 a3 L. B- c, w) Z8 ^
  9.         # 元素整好的中间位置
    3 ~5 Q7 r7 ?; |! e
  10.         if arr[mid] == x:
    1 u9 j7 O6 J- I
  11.             return mid / H7 U5 J. E" v9 S  ~! J3 V8 _
  12.          
    + x+ e: l( M9 q
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素
    , d& g3 k) k; L# o) k8 }
  14.         elif arr[mid] > x: + M; H# T; g* M) Y
  15.             return binarySearch(arr, l, mid-1, x) & v" q( [! c0 X* w4 M1 a
  16.   
    5 E! Y# q! S& d8 V0 [* |9 O
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素& K8 I. i, }# S& L) J3 ~7 [, i2 u9 s
  18.         else: 5 d6 u( J7 q* I/ q' A- z: w7 j/ w
  19.             return binarySearch(arr, mid+1, r, x)   l" |  p1 X' M7 r9 k+ r. q( L$ f- B
  20.   , s5 \4 S: P4 C5 @
  21.     else: 9 u. w$ D) [7 C; U
  22.         # 不存在7 k7 Q0 w: k0 A1 E, v3 v1 J4 g0 }
  23.         return -1
    3 E2 \# f( ?0 h( P
  24.   
    / z# \% K' R. d
  25. # 测试数组
    + M8 ]% f; o* j$ G
  26. arr = [ 2, 3, 4, 10, 40 ] + s; x6 E9 w# Y3 _% r. y
  27. x = 10
    . e" F# T; }& I* V+ Z; d9 v
  28.     @5 ?6 L. z, l3 ^) t4 r' h1 F% _
  29. # 函数调用
    # @- ?! h" h% h; z1 ^
  30. result = binarySearch(arr, 0, len(arr)-1, x) * R, W* S; E$ m# t4 e3 h# X
  31.   ( C" Z1 T7 P$ L1 C5 M
  32. if result != -1:
    + R8 l; k; v4 J) s+ \% N
  33.     print ("元素在数组中的索引为 %d" % result )
      j  w1 o6 V3 {8 |
  34. else:
    9 M7 Y3 n$ H4 u) t  Y3 A1 y! A
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为2 s. a9 a2 \) u# m
  1. 元素在数组中的索引为 3
复制代码

9 i$ H4 W2 b6 \/ ~# X
1 Y  d2 A% {/ q! O( F# m3 i/ a
1 t! S9 P8 a+ @& u% t4 v5 n" q" Y2 h4 ~) l
. H2 V5 w' y# t& \$ @5 ?
注: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-1 19:12 , Processed in 0.083854 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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