新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1098|回复: 0

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

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

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

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

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

  [3 B7 ?: e: m0 V! {3 b Binary_search_into_array.png
; Q( l" B( Y) Z
  1. """
      x, S5 y3 @! `2 A. o! m. {
  2. 顺序查找经典案例1
    ; f( t6 ]  }3 C8 h: V: D
  3. 素材来自新大榭Python学习社区,帖子号:7124#. \3 ^+ y; z4 W- Q' w1 e8 f. t2 ^7 _. o
  4. 首页 http://www.daxie.net.cn/py/
    ; U% u+ R& y- \
  5. """8 l% ]2 w3 z: @2 ~# K
  6. a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
    : x3 u+ s& @1 m& j/ Y
  7. key=int(input("要查找的数据为:")) #输入待查的目标数据key1 c) `# T- O) ]! g3 G( s+ w
  8. L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0
    2 t& v& j( @, B1 a  m& N
  9. R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
    9 O5 K( z6 [' b* T
  10. flag=False #初始化定义没有找到时的值为False8 d/ X  G; @8 K5 H
  11. while L<=R: #左边界小于有边界,即当范围内有数据时6 T4 ]$ ]+ \' \0 Y' K& f; ]9 X
  12.     m=(L+R)//2 #取中间元素的下标m
    6 b1 [! p- }( I; Q2 Y! Z
  13.     if a[m]==key: #比较中间元素与key,若相等
    & O6 B& q$ ?! F
  14.         flag=True #满足相等条件,即成功找到元素
    7 ^2 c6 a, [1 e; h- @& ?9 A
  15.         break #结束循环,退出循环/ q9 b1 Y1 s; G' k0 B9 T# p
  16.     if key<a[m]: #如果key比中间元素a[m]小! y" e2 z: k& D& {9 h
  17.         R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)- L9 s# R, e) G/ e
  18.     else: #否则(key比中间元素大)
    7 w0 ], J# A# W
  19.         L=m+1 #左边界改为m右边一位的元素1 I) V: g4 U' Y8 X  B! o; a
  20. if flag==True:
    + T+ N8 v- f* R9 ^1 R
  21.     print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功# f( g1 L1 Y, s$ E
  22. else:+ O2 s4 P) V3 m# e- Q% S2 C5 s) e6 _
  23.     print("查找失败") #未找到的状态,输出查找失败4 b2 r+ o# V8 U' S; v( x
  24. 4 a" D0 k9 t- h( q
  25. #【分析思考】1 M- D% s2 {, J6 e
  26. # 略。。。( w% s7 X3 x1 i2 ^
  27. , B/ s6 Y, S( h$ R
  28. """, F, U4 v: Q, G4 Y- L! [* O
  29. 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
    7 L% T. m$ B2 j
  30. """
复制代码
% h- n6 ]/ z" k+ k. _9 b+ x" A
实例2 : 递归
/ h- u( d$ \  F8 `1 }! |6 N! p6 |/ _9 v4 {
  1. # 返回 x 在 arr 中的索引,如果不存在返回 -1
    0 a' l; e1 X& B- i
  2. def binarySearch (arr, l, r, x): 7 [# |9 S# W' s
  3.   * J: k* A. t1 J" g7 P
  4.     # 基本判断
    3 v6 L/ m# P- }, h* r1 X
  5.     if r >= l:
    % |( G9 w1 b- S4 R9 r
  6.     q! w7 r& O8 }9 V  [* ]. b/ K4 [4 \
  7.         mid = int(l + (r - l)/2)' W/ Z. l1 S8 Z; j
  8.   
    8 k& E) g9 ~1 @8 V& L1 b% o
  9.         # 元素整好的中间位置
    9 ]5 l4 X/ n: R6 U, E
  10.         if arr[mid] == x:
    . q: V9 }5 n5 `* @. E; k4 \, K
  11.             return mid 4 |  N7 Y6 P2 C
  12.           6 }+ M' ?' \( A* `1 n7 X. |! D/ A
  13.         # 元素小于中间位置的元素,只需要再比较左边的元素
    " j3 j* ]7 X2 C7 P, K5 W+ a
  14.         elif arr[mid] > x: ! G- {; J% T+ O; M
  15.             return binarySearch(arr, l, mid-1, x) 6 q3 [) m0 ?: p9 P
  16.   4 r7 f: E3 a7 A! y. u
  17.         # 元素大于中间位置的元素,只需要再比较右边的元素& I7 i2 O2 @9 A# Q/ @6 L
  18.         else: , F! G# [! k/ E; }
  19.             return binarySearch(arr, mid+1, r, x) % x( ]7 E  F% j6 n
  20.   ( l! n8 q2 \* Z- n& f; d
  21.     else: " F% e4 ^2 c3 G, W+ a1 t& \3 j
  22.         # 不存在5 M5 L9 ~6 F+ S' _' D" o1 s, Y  M
  23.         return -1
    / i! c) M0 A5 R) k; x3 e0 J
  24.   * {+ g3 ?5 x: C' f( X5 C3 E
  25. # 测试数组. X1 o( P$ e6 ]; ~% ~. \" G
  26. arr = [ 2, 3, 4, 10, 40 ]
    + M! U9 x  V, Q" F
  27. x = 101 p$ H8 m  C* I* H3 g# L# U
  28.   
    3 Q- A5 `4 }. U, K. S; z
  29. # 函数调用7 [/ Y+ v5 m" V( Q3 Y  Z
  30. result = binarySearch(arr, 0, len(arr)-1, x) 7 b7 n8 t: d6 z$ f
  31.   0 W+ e5 E! y$ d. `  F1 C
  32. if result != -1: 7 {7 a! B+ T" {# q( g( F5 T' L# n
  33.     print ("元素在数组中的索引为 %d" % result )8 B1 y; l  y, T9 }, S3 z! Y) ^2 ]
  34. else: 6 v$ Y7 _: e# G/ _1 K& W) z0 f
  35.     print ("元素不在数组中")
复制代码
执行以上代码输出结果为8 ?% B% y$ A1 w: B5 }7 J/ x- j
  1. 元素在数组中的索引为 3
复制代码

0 ^7 [( ?5 J' T( P8 t9 ]5 s( e1 k* d( C* ?% I6 b( Y
1 z. _) V2 v$ i9 A

5 X  I' [. b3 ?( N& T* _( U
! a& Q5 a9 o2 _* b注: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-10 10:57 , Processed in 0.101237 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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