|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
二分搜索 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
. ^; U# s% g5 @/ N! K
! X% c3 Y# h0 g- """
( ~) L" V/ Z3 ]7 n - 顺序查找经典案例17 t) [6 f$ Q' Y: L% d' V# S( Q8 u
- 素材来自新大榭Python学习社区,帖子号:7124#3 y# ^- N4 K+ k( k. d# K
- 首页 http://www.daxie.net.cn/py/
. R. G9 } Q- @7 I' n - """5 c [/ D( E) c! }8 }
- a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
: ~- j* s- R& ~: [ - key=int(input("要查找的数据为:")) #输入待查的目标数据key
. s% W# D2 x3 m0 A# Z6 x" @ - L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0
$ I9 P' Q1 C7 C - R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1' `& p+ Z0 z H6 C' K; [; T( |# b
- flag=False #初始化定义没有找到时的值为False4 [/ n. L8 A3 i" C: \% V, \
- while L<=R: #左边界小于有边界,即当范围内有数据时7 K2 t! s. }9 p( d5 e+ ^2 L
- m=(L+R)//2 #取中间元素的下标m
5 r& V4 P# K; \" V5 \/ r, a - if a[m]==key: #比较中间元素与key,若相等
# r7 r1 W' V. O: U - flag=True #满足相等条件,即成功找到元素
?7 j- z* j4 T' N6 C8 B. @4 v0 T - break #结束循环,退出循环
. j. j& m* v% S' J+ _ H+ \ - if key<a[m]: #如果key比中间元素a[m]小
4 A2 F% |8 c- G1 h - R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)
9 ~9 T& S8 r' ` - else: #否则(key比中间元素大)
0 q! g7 M" K8 E# w4 N* ]6 K - L=m+1 #左边界改为m右边一位的元素
/ P# a F+ m) r, O$ m& R - if flag==True:
4 }* n* E# E" \ - print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
1 |% n+ h; G" k2 Z9 y# Q; v - else:- d8 K8 c5 ^5 _& g3 `$ ~5 g
- print("查找失败") #未找到的状态,输出查找失败& @/ X5 S- ^' H" X9 R
- 3 t* _4 U, u! ?1 f- ?8 @
- #【分析思考】
& G3 e9 n# }1 P3 d: V* n3 j - # 略。。。0 J5 G# M6 y. g; _+ n: O$ G
. {/ G2 [) d8 C9 P& O* P0 g! g, C- """
3 J' u$ l3 k0 u& w9 X& M - 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
5 ~. z& T$ Q" ]7 `: o, B - """
复制代码
- l( I5 R& ~9 t实例2 : 递归
7 C6 w! x# M1 r# Y" H1 I- # 返回 x 在 arr 中的索引,如果不存在返回 -1) i# T5 u2 {. R
- def binarySearch (arr, l, r, x):
" q, \+ V. ~( w. Z - % @) v& O6 e0 g. E; {7 R1 h9 y
- # 基本判断; {( @3 V% T, j) Y5 M
- if r >= l: $ F0 Y. g+ t0 H7 K s6 g. ^
- # K# @3 a. e0 s- U
- mid = int(l + (r - l)/2)# Z8 n4 D; ~( ]& u( Z- r6 T$ }
-
# @( L: q) T5 I8 o! H - # 元素整好的中间位置! E* z6 d! ~8 n/ K1 x4 \! j1 m/ |
- if arr[mid] == x:
, m) }2 V K$ c1 B) z e - return mid
4 b7 d9 W$ b0 l8 s$ Q8 [- a -
* {/ {% }3 X1 x - # 元素小于中间位置的元素,只需要再比较左边的元素
3 u3 Z6 P6 i0 N, b - elif arr[mid] > x:
# O& j; z2 h! f" B4 f& d& R- } - return binarySearch(arr, l, mid-1, x) : X. G7 m1 q% Q4 Z' D6 \
-
* M0 P' p5 ^$ {1 A Q- D - # 元素大于中间位置的元素,只需要再比较右边的元素: `3 m, g X$ t+ y! c+ P2 {
- else: t2 T: {$ c+ ^8 ~; N& ~, q
- return binarySearch(arr, mid+1, r, x)
# n' {- ]7 H# K - # [' q* J0 {* ^; V: y
- else: * I) t; J: T* t4 i
- # 不存在
: s$ N ]& t$ {) a, G: ~% ], a" x. ] - return -1
/ \, `' y3 j0 z' m7 X8 N -
- |& Z! m8 K5 E - # 测试数组5 y8 S: ^* v1 b/ u' N& t! a
- arr = [ 2, 3, 4, 10, 40 ]
) j" z$ x- G* z( t% q9 A, o - x = 10
" V5 X6 u$ a$ a3 g. r2 V - 2 h( A+ ?( t' B
- # 函数调用
: I$ }; T- R: f1 m% O; c+ E - result = binarySearch(arr, 0, len(arr)-1, x)
, q) F" C4 C. C3 F -
" i% ?! F8 D) G) m - if result != -1:
3 b' m/ `5 F+ w - print ("元素在数组中的索引为 %d" % result )# w5 r. ^8 E% y h
- else:
1 v4 e6 p2 T3 u4 l6 U8 w - print ("元素不在数组中")
复制代码 执行以上代码输出结果为:
# \: l6 p, G" z# f, H' G% {) W$ r ]9 w0 w7 `* z- z4 t1 p x
+ A; t; b" B- }1 w9 b; _" p3 c
4 d7 P. J, V4 g/ f5 M8 I' G* Q
) F2 d; E( m( g( ?8 d4 I
7 J* ?$ Q6 |; y; q注:log2X+1 = ? 次 (X为序列的总元素数量) |
|