新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1054|回复: 0

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

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

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

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

x
二分搜索 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
# E9 @6 \* T5 c* m
Binary_search_into_array.png , T$ n/ v" b) d2 d
  1. """$ @6 Q! y8 a$ z9 h  ^+ v' s) ^
  2. 顺序查找经典案例1
    4 S  [3 a9 h; O3 S
  3. 素材来自新大榭Python学习社区,帖子号:7124#
    + Q- n. H4 R) l* n# o$ S4 L
  4. 首页 http://www.daxie.net.cn/py/
    9 I9 G0 E, u3 m; [  |9 _% p
  5. """
    2 K* }  m9 R: N/ M
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
    & E0 Y3 S" ~: e4 Z
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key
    & U, F' V& `( H
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0
    & p# @' w$ Y! u2 k9 P7 U
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
      ]5 Y. u/ }" k
  10. flag=False #初始化定义没有找到时的值为False
    - k! B/ Q' B+ a! h& r
  11. while L<=R: #左边界小于有边界,即当范围内有数据时
    4 U9 E# j/ O2 s& E1 H8 Y# s
  12.     m=(L+R)//2 #取中间元素的下标m' ^- S! @+ ]( k0 M! P3 D
  13.     if a[m]==key: #比较中间元素与key,若相等
    7 Z6 n: ~9 N; x& M) n3 @' l. H
  14.         flag=True #满足相等条件,即成功找到元素2 D# r7 Q( h2 D# [7 `9 A0 x
  15.         break #结束循环,退出循环7 j7 q  w8 l- ~3 q
  16.     if key<a[m]: #如果key比中间元素a[m]小
    # Z2 B" m  P0 a8 d7 E2 _: h% F
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)
    ( E" n( j* ~7 p' x
  18.     else: #否则(key比中间元素大)2 p0 q; Z6 u4 U! h1 D
  19.         L=m+1 #左边界改为m右边一位的元素
    1 a5 k; w" y' c- n. F+ E6 b
  20. if flag==True:$ B; v! `+ b, F( ?& e
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功- D+ `* Z( q7 T$ ?/ j" N% ]
  22. else:7 }' A( F) O' _* v# }9 p
  23.     print("查找失败") #未找到的状态,输出查找失败
    5 }8 r5 @. E- f/ Y

  24. ( l9 n; m8 d5 p4 K  x
  25. #【分析思考】0 U* s8 z( `. [; y- Z9 I$ x" I
  26. # 略。。。( ^6 G4 ?6 v* {2 e
  27. ; w2 b9 \# B& V, ^, }: Z! ]5 z
  28. """
    % f4 v0 y3 j4 R9 p' @0 l
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4( G+ X0 j/ z6 X
  30. """
复制代码
7 \9 g/ w  l- |) R* C- e
实例2 : 递归
; E; l" x6 d- H7 T3 H
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -13 Z5 t- Z( d2 a7 o# j
  2. def binarySearch (arr, l, r, x):
    $ l# M8 Z; Y6 X% }
  3.   6 F' j; j' F! |8 F( Z+ G
  4.     # 基本判断
    0 j7 U$ T. }2 P. n( s0 t
  5.     if r >= l: ! O/ j3 L# w7 ~# Q
  6.   , ]( H# b! s/ _9 t) U& v# {
  7.         mid = int(l + (r - l)/2)2 R% S( E; U: y9 T6 @  _: @. N
  8.   & s# o/ L, q0 b8 k. n4 P$ [' Z
  9.         # 元素整好的中间位置
    " w: i0 `9 x: \. z2 U
  10.         if arr[mid] == x: 5 Z8 k4 ?6 g4 [
  11.             return mid
    $ V6 ~0 ~' ]: R$ T& e3 O/ l# G
  12.          
      c: j, j1 Z% S5 z6 T3 p5 x
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素
    . M2 E: P9 w: b! S
  14.         elif arr[mid] > x:
    + H- X+ S- d0 c. L2 [: T  R
  15.             return binarySearch(arr, l, mid-1, x) ( i" f; k) Q0 R! g6 ^' {0 e5 A* [8 d
  16.   0 q4 i1 S2 F& @2 t- g/ K" p/ x8 u
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素
    6 q% {; E8 O, r) ~' h$ C  L
  18.         else:
    , ~% c& H/ m* Q, l5 |* I/ u
  19.             return binarySearch(arr, mid+1, r, x) 8 K0 v* D3 ?4 {+ `$ s; k7 B# o% T2 ^: R  a
  20.     D; B1 ?6 C+ M8 s5 j2 l* q
  21.     else:
    , f7 x% r6 a: ]
  22.         # 不存在6 N" h: F: [/ `# }
  23.         return -18 g5 o5 h& F/ }& v1 g
  24.   
    0 M: E7 \# N2 C
  25. # 测试数组
    0 y9 g% T4 C6 [5 j
  26. arr = [ 2, 3, 4, 10, 40 ]
    - V) ]8 v/ M( L
  27. x = 10' R' c! _8 s9 z7 W  e7 c" G
  28.   
    $ H' N* d5 Y) f
  29. # 函数调用
    0 X' b" a/ G! b
  30. result = binarySearch(arr, 0, len(arr)-1, x)
    % K/ g& g+ X9 ~, Q3 a3 G) A
  31.   , O7 s$ Y. V3 f$ ^5 d( c# K
  32. if result != -1: ( W+ N2 t0 d; j$ X
  33.     print ("元素在数组中的索引为 %d" % result )
    8 J, f; l3 i- G
  34. else: . c. T# [( @/ q
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为
! O& t" U. I/ Y0 `, J, ~1 `9 `
  1. 元素在数组中的索引为 3
复制代码

$ _! o7 o5 M1 k! V( i4 [7 g& ?
" p- X. F& |) A, u( S5 j: @) E/ \7 h, N4 Q5 M1 Z

7 ^( z2 T2 r. L5 U( w& C3 r. x& l  V7 B! Q) w. m4 @
注: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-28 20:46 , Processed in 0.086170 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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