新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1110|回复: 0

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

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

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

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

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

/ t% d3 B  }7 p+ p0 c) U& B; y( c+ z Binary_search_into_array.png
% `( o3 w) I8 E; C% V6 ~
  1. """; H- `( Q3 k+ Q* u# _
  2. 顺序查找经典案例1
    . ^2 M" D  S1 f* S
  3. 素材来自新大榭Python学习社区,帖子号:7124#" [0 K# p7 c# D3 k& e+ ]- t% ?7 q
  4. 首页 http://www.daxie.net.cn/py/
    % R$ M) B1 g( @7 r0 R& v+ J6 c
  5. """: ^5 M' J0 A* n, e
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
    . ~9 b8 L% j: c  V7 M% N7 {
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key, z! r; b* e- o5 s6 D
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0
    , k  d+ F( L1 K  r# g
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-17 V! C# Q% Q. g3 M
  10. flag=False #初始化定义没有找到时的值为False' G0 {$ @0 }( C$ K; x) S  ?
  11. while L<=R: #左边界小于有边界,即当范围内有数据时
    - g3 Y/ u/ M6 F1 ^! H: j% W4 }
  12.     m=(L+R)//2 #取中间元素的下标m8 `. N6 M8 D8 G( d' _
  13.     if a[m]==key: #比较中间元素与key,若相等
    7 z4 D* Y' I0 u1 u
  14.         flag=True #满足相等条件,即成功找到元素
    ( i# |  D6 G9 p' H9 m8 }
  15.         break #结束循环,退出循环# w' x( E+ ?6 r, Y% O' r
  16.     if key<a[m]: #如果key比中间元素a[m]小) Y6 d" ^# }" y! g4 {0 @, x, S
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)
    / o7 B; S- z) b2 K/ @
  18.     else: #否则(key比中间元素大)6 j( G2 t1 y0 l7 W6 q& P7 N
  19.         L=m+1 #左边界改为m右边一位的元素1 d- c, ^% J1 A
  20. if flag==True:
    3 M7 M- d9 C, s  ?& Q5 h
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
    * _% |# h4 ~; ]8 {# C4 y
  22. else:5 M4 T7 P* v* I# r; F2 H; t! j
  23.     print("查找失败") #未找到的状态,输出查找失败! K% w3 K: L3 c' K
  24. + x* i8 p* X: o+ y5 }6 G1 A
  25. #【分析思考】
    8 Z! h4 ]; z0 }! i' k$ @* P% K
  26. # 略。。。
    - t5 r5 {3 q" x, \( `+ R

  27. 2 [7 {3 V, {; N1 y" F: s
  28. """
    4 i* N% T( P4 b3 a
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
    ' W) h4 O% v/ H9 K/ |) v
  30. """
复制代码
: E1 z8 U6 ]  B$ G6 j/ b
实例2 : 递归
. u! A: x5 }' {; A" H4 h6 J1 ?
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -1
    . Z! S" a: ~4 f
  2. def binarySearch (arr, l, r, x): 8 ?  n8 r& H3 x3 c1 e
  3.   4 \% i8 g1 \" ^8 U4 v
  4.     # 基本判断
    2 {/ r' K0 J  x1 Z6 O% {
  5.     if r >= l:
    $ C0 y, X+ @, K# C
  6.   
    ! }4 a  X# H+ A& Z
  7.         mid = int(l + (r - l)/2)
    3 X/ W2 E, |/ _% ?, S
  8.   
    & z2 S( Y8 ?4 w
  9.         # 元素整好的中间位置' p! S6 z% F! Q
  10.         if arr[mid] == x:
    3 R  v( \8 z1 d8 u9 |: o! Q
  11.             return mid
    . M" i( ]8 r) ~% C
  12.          
    . r" f$ u; H5 b8 a7 T1 e$ E
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素
    : j% i. }# m+ Y
  14.         elif arr[mid] > x: % x3 m, O# Q5 h- j1 J
  15.             return binarySearch(arr, l, mid-1, x) * q+ Q- C# Y- Z& }
  16.   0 R& C+ c' \, x# Q  p6 V/ i. N9 n8 j
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素# F% d$ c7 q8 G' L" W7 K! s
  18.         else:   Y0 Q& _0 b* a2 q/ N/ C1 k
  19.             return binarySearch(arr, mid+1, r, x) 3 l6 U9 p& p; u6 T5 q* O! N4 y! H
  20.   
    ; ^" s2 u* ^& [# J
  21.     else:
    4 m! h- Z) l* G. Z0 F5 @- z) E
  22.         # 不存在
    ( i% y$ B: c: ^) Z  {' K
  23.         return -1
    ! ?2 ~/ U/ d6 u1 g+ m- l8 |
  24.   
    * o' j1 D5 b/ p/ _+ O
  25. # 测试数组; k* }9 @4 L# M
  26. arr = [ 2, 3, 4, 10, 40 ]
    8 V  J' B8 |+ v
  27. x = 10
    ) B  h5 Q* P& r1 l9 c0 u
  28.   
    ( f6 f! {1 r" Q' }0 y  S" w4 ], M
  29. # 函数调用
    ; P9 t& u: ]5 U0 f; h) l. Y2 x$ ?
  30. result = binarySearch(arr, 0, len(arr)-1, x)   v( _1 b! X$ h: R' ^
  31.   ; \# U+ ?6 O2 B, B1 N0 e9 E
  32. if result != -1:
    % c6 W% P1 U$ u7 o; y: u
  33.     print ("元素在数组中的索引为 %d" % result )% N9 d$ |7 n" g6 e5 t$ y
  34. else: 4 X+ Y* C' v) _- s$ V, O, j
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为: B3 q; _5 t8 }
  1. 元素在数组中的索引为 3
复制代码
! {# S2 M* s' I& P' k
3 c0 H! e) _: a% C
- c) t/ S0 U2 K: w- s3 w# [- j
6 F* E, K$ c! r- j+ V$ G' a" ]/ h& Q
3 |9 n9 O( A) j/ s; L6 E6 m
注: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-4-21 09:23 , Processed in 0.104530 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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