新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1051|回复: 0

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

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

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

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

x
二分搜索 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
1 k8 x3 T3 A( e$ r- `0 [  a
Binary_search_into_array.png
( t; v$ e0 W# u  f6 I+ c
  1. """6 P* T) b" g- G) d, Q9 K2 H
  2. 顺序查找经典案例1- a9 a& g6 Y& {" b& k5 k9 e" h% Y9 Q1 G
  3. 素材来自新大榭Python学习社区,帖子号:7124#
    : j0 L" P: W0 ~/ w6 b" V$ t
  4. 首页 http://www.daxie.net.cn/py/ , G. _4 u+ y1 L2 D9 g
  5. """
    ; R6 u# K/ @% ~& R$ Y
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列1 G) T3 h2 }! z  O! @
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key+ k$ _/ I5 b% ^3 D7 m# {
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0; r7 |- ~) p0 H( p; s" |" @4 E3 ]; |% M
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
    ; z+ z0 l! w$ {4 X7 p
  10. flag=False #初始化定义没有找到时的值为False. [+ A. O% O) a9 e. |+ L
  11. while L<=R: #左边界小于有边界,即当范围内有数据时
    9 {; C* v  i2 Q4 D' d6 e8 }" M
  12.     m=(L+R)//2 #取中间元素的下标m
    * X4 R" A/ o2 B, h3 ?
  13.     if a[m]==key: #比较中间元素与key,若相等/ K. @3 E3 ?, \: Y0 d8 U8 h' l
  14.         flag=True #满足相等条件,即成功找到元素* C8 l; J! \7 \
  15.         break #结束循环,退出循环* j+ i" ^1 M# ?6 [% s) _: o, w
  16.     if key<a[m]: #如果key比中间元素a[m]小- I' k! X) h7 P! l; v% a; V, Z! a
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)+ I2 K! G2 p* o. w4 n6 M" {
  18.     else: #否则(key比中间元素大)8 ?$ I  s; N- q+ h: Z
  19.         L=m+1 #左边界改为m右边一位的元素
    ) [9 S# ~! Y1 @! D" x8 p  E# _. ?$ H8 R- c
  20. if flag==True:
    + ^% q) D; P% n7 P3 h
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功2 a- j7 P- e6 ?
  22. else:
    % Z/ a) [  J) U5 f! J1 G7 `& R" y
  23.     print("查找失败") #未找到的状态,输出查找失败- n9 \& Q/ v" |+ _6 ?0 \! F7 ?( c& k

  24. 3 q- L7 M) x5 B6 f
  25. #【分析思考】; `9 ^1 G1 r: k! k3 C! I" b' K
  26. # 略。。。
      r" z% h7 E8 c( G
  27.   z) F; O2 x* Q0 b7 `+ |% F
  28. """
    7 q; `, t/ b# h2 A7 c1 F
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
    - X+ O) \+ K: @: G
  30. """
复制代码

# s2 K- @8 P4 \实例2 : 递归
$ i) X- o* w' d0 G6 X6 g
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -1$ F( e6 x6 R/ F+ B! v
  2. def binarySearch (arr, l, r, x):
      A# C0 r, F- g# l0 V; i. s+ V
  3.   # |: m( B) i' {1 F; z
  4.     # 基本判断6 }8 r1 M% \- b) p2 u7 @$ _% s
  5.     if r >= l:
    8 e" I# G3 B! n. l
  6.   * Y7 n2 k# I3 }: |! d6 F
  7.         mid = int(l + (r - l)/2)
    ) N: L' o1 [7 |2 T, A& M
  8.   
    & g6 U# ^$ p2 ^# c& m: w8 r
  9.         # 元素整好的中间位置; e* U+ f" _8 F( A2 B, c
  10.         if arr[mid] == x:
    # G0 v2 Q: l6 e% x" X/ T7 @
  11.             return mid 9 S9 u0 ~/ T1 J/ W3 d$ U) q
  12.          
    : g9 `  O% O0 s( Q$ r, g$ Y
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素1 x$ J9 x! F' g) m
  14.         elif arr[mid] > x: ' n4 c0 u3 I. K7 x" h
  15.             return binarySearch(arr, l, mid-1, x)
    " X' R2 u7 k% K3 l4 |, Q. R% m
  16.   
    ! ~' l' J8 g) E  _, D" \
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素/ I4 [& d! I+ s9 E7 o  d6 B
  18.         else: ! ]" o' U* U& S6 w9 @) r6 ]
  19.             return binarySearch(arr, mid+1, r, x)
    ; p7 j3 C6 O, _7 F7 j/ ^
  20.     Z" _$ z7 }, L" ]4 r, N
  21.     else: . h' h6 Z) }! x% g; X& D
  22.         # 不存在$ Y' }9 u4 Q7 G8 K+ ~% x
  23.         return -1
    & f; l( I3 A: `; y7 g0 y- O6 v
  24.   
    + v" z* T+ B" W5 I) m; o* k- t
  25. # 测试数组
    ) c9 C; C" K7 `
  26. arr = [ 2, 3, 4, 10, 40 ] ; Q: `# F" U2 H/ _  o/ o1 _, H
  27. x = 107 [( r) r. }, B3 W  I
  28.   
    , e7 y, W: K. w( {( w% }& Y6 ]7 m9 n
  29. # 函数调用1 N! ~* C/ @2 `# q+ ~) A, t
  30. result = binarySearch(arr, 0, len(arr)-1, x) 4 \4 n0 A# q6 K& M5 E! i$ _
  31.   ) o1 o$ P" i) x& u
  32. if result != -1:
    + }, T9 f" s' {0 W: l
  33.     print ("元素在数组中的索引为 %d" % result )
    1 p& k* f4 Y9 [+ y" ~
  34. else:
    4 B4 a( y3 i( w3 c3 y
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为  c) N5 p7 }' o/ m
  1. 元素在数组中的索引为 3
复制代码

" b) D/ Q* v5 S2 M. V5 a6 s; s5 U  R9 F% i0 x1 X( A
* W" {5 c8 O% s# Y* o

+ F4 ?; ?1 y! V* W) l" l
6 q1 Y. _  ^; u" R5 y) `! q" x注: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, 2025-12-24 06:41 , Processed in 0.083524 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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