新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1049|回复: 0

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

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

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

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

x
二分搜索 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
' W5 \- H4 J: P, v8 W% _; e/ p
Binary_search_into_array.png ) u; A$ K/ R, l& z# N
  1. """( B# _3 w* e% w( a) A
  2. 顺序查找经典案例1
    6 o" h% ]1 k: p* Y1 u7 L
  3. 素材来自新大榭Python学习社区,帖子号:7124#/ t7 h' o, R, V0 i. b$ J4 i
  4. 首页 http://www.daxie.net.cn/py/ 4 r# K4 {/ g5 m  R* C- W% H: M
  5. """  o9 J* v6 f6 ?4 h" X
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列3 r2 e: C' b0 ], b
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key6 s+ N6 V7 |* O
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0( A( e2 o) w7 u) I: a6 M6 q; A
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
    . @8 @) h! F5 N6 X. ~2 u
  10. flag=False #初始化定义没有找到时的值为False# R! Y) q. p) f1 S
  11. while L<=R: #左边界小于有边界,即当范围内有数据时, ^- s6 a; |" D+ V$ \. z
  12.     m=(L+R)//2 #取中间元素的下标m0 ]7 x3 R7 O5 D$ |6 {
  13.     if a[m]==key: #比较中间元素与key,若相等7 t& e; Y" Y% P3 ?$ `: a
  14.         flag=True #满足相等条件,即成功找到元素+ `/ ^4 p+ h! G* W+ J6 b
  15.         break #结束循环,退出循环% U/ m7 b6 b; e5 C* K$ V1 I- Z
  16.     if key<a[m]: #如果key比中间元素a[m]小5 n; c  l6 f! ~, F. X
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)& _( _' Y  L4 R4 b- B
  18.     else: #否则(key比中间元素大)( }1 K/ z, @' c( w% N( h2 w
  19.         L=m+1 #左边界改为m右边一位的元素
    ' n- |9 X! U/ h
  20. if flag==True:; Y. o: {! t2 P' C' y
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
    9 i, e. C1 O9 U$ l+ M5 m
  22. else:# N2 F+ Z. t4 e, |! r& Z
  23.     print("查找失败") #未找到的状态,输出查找失败
    ! Q' l5 U" c5 E; o- u7 Z0 v' u3 }; G

  24.   n7 ?" O) X4 ^
  25. #【分析思考】
    2 S, k) v6 D1 d; R
  26. # 略。。。7 p* p$ [! @* T+ X) B. e9 G

  27. ( W9 {7 L( d( y3 c& C  g1 I6 ?
  28. """& q$ [8 q8 m1 r. \) i3 O
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
    4 I! r0 t' V# ?. K
  30. """
复制代码

* W- K4 B& Q; `. {' ~. i实例2 : 递归
& \& B+ I' c# a+ Y
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -14 W. y, W5 x4 C0 I) V
  2. def binarySearch (arr, l, r, x): . ~2 E  f8 [* ~  ?7 ?$ {
  3.   % k; [' k& j9 S3 q, l1 P0 [/ q
  4.     # 基本判断5 G9 y9 s" W& d2 V, q7 q* V
  5.     if r >= l:
    / Q5 W' R$ N: n
  6.   2 `* e. }& T6 Z  O2 R* q
  7.         mid = int(l + (r - l)/2)/ h( D; M6 W! C( x) i5 s0 e) u% A* o
  8.   
    * C( n& b' b- k8 ~
  9.         # 元素整好的中间位置
    * I4 n  D+ M, p
  10.         if arr[mid] == x:
    + m  b' H9 K, _
  11.             return mid ; K8 v* p! h; [3 K9 _. v
  12.           + P; V4 N) y' h0 e
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素
    % V- B+ e; i5 [% @
  14.         elif arr[mid] > x:
    6 Y- f, Z2 }" i' h
  15.             return binarySearch(arr, l, mid-1, x)   w8 T. n: _( g6 s! {+ ]
  16.   
    * K8 U2 G, n& r+ [% a
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素
    , E: W. j0 T9 W" b% z4 n$ k% }
  18.         else: ( s+ P9 U! b: m( G5 i" z
  19.             return binarySearch(arr, mid+1, r, x)
    7 r. N0 G# }: g
  20.   6 v  M1 i1 }9 m+ x# R" [
  21.     else:
    - ~% G2 Y4 g5 V& s3 n
  22.         # 不存在: d6 G) f' D' F4 ]
  23.         return -14 ]0 k. E$ {) ^3 |
  24.   
    , _  u  J2 r' ^- d0 `& ^, t
  25. # 测试数组& p% E% ?/ y' F0 G5 p& c
  26. arr = [ 2, 3, 4, 10, 40 ] # D% P2 A7 }3 l' a
  27. x = 101 v$ Q  _- R# z: V; n1 E  g/ O- J0 {
  28.   ' @4 u3 E3 N; q& q
  29. # 函数调用1 z7 r3 G6 p( s3 o& q$ r+ H
  30. result = binarySearch(arr, 0, len(arr)-1, x)
    ( z* K) m$ o* S
  31.   
    5 i' {0 t2 |, K% U, d3 R
  32. if result != -1: 9 I* X* h  q) ?: N) r1 x: L2 V) o
  33.     print ("元素在数组中的索引为 %d" % result ), J9 [. b1 V( k$ L
  34. else:
    0 z  N4 u" G6 I; R# n! z
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为
9 s% N4 i9 k: a7 X7 e6 o; q
  1. 元素在数组中的索引为 3
复制代码

/ @  \" ~, g0 ?' n. a; U; Q. ~) L2 u; ~

6 r) k1 h; q9 D- }. c' K; l; s& u
+ ~( q% `. Q: ~
8 z. D& J/ o, J& j: I* T; A/ h注: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-11-10 00:59 , Processed in 0.084901 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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