|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
二分搜索 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
0 s2 I- y) E) S7 }
1 j/ S) `* ^9 _7 t6 A7 B3 s- """
6 U. B, o: \; X& j7 M - 顺序查找经典案例12 q, \$ g# J5 J! d) K
- 素材来自新大榭Python学习社区,帖子号:7124#
% A/ ]3 L( f1 ~) U* c9 T - 首页 http://www.daxie.net.cn/py/ # d" c% Y4 Q* Z& \( \, \
- """ B% M8 Y$ g) e O& P2 Y3 R
- a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
9 @# d5 U3 j7 M$ {# y - key=int(input("要查找的数据为:")) #输入待查的目标数据key
: L3 F! L$ ~6 W3 q) F - L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0
, E+ k7 p3 L* Q k" U9 v# S - R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
) ~# z0 g5 ^* _: M2 r - flag=False #初始化定义没有找到时的值为False
4 K1 N' b) [$ D - while L<=R: #左边界小于有边界,即当范围内有数据时- a' E/ [! }* I5 z2 c `
- m=(L+R)//2 #取中间元素的下标m4 ^8 N+ H; a. z* j0 i8 j
- if a[m]==key: #比较中间元素与key,若相等
/ m6 f) A2 M& x6 M* ~ - flag=True #满足相等条件,即成功找到元素% Y2 g" N& G9 m% J O
- break #结束循环,退出循环
0 G% x |3 w7 B9 f1 X5 w - if key<a[m]: #如果key比中间元素a[m]小
* k: j& `% m" H - R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)* W1 V# v3 Y3 \/ n/ w
- else: #否则(key比中间元素大)( T8 P* |- `$ m" \
- L=m+1 #左边界改为m右边一位的元素( S: ]7 `* v0 C( }4 S- S" v
- if flag==True:1 L% U9 Q5 @% a1 }1 B
- print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
' g0 I6 k) G* p! E: K0 [ - else:# A+ E" K+ i Z2 |% `7 I
- print("查找失败") #未找到的状态,输出查找失败- c$ T% _4 l: d# Q. T+ }- k. l
- 4 R+ r- r# |# K Q
- #【分析思考】& F- [: N) Z& N1 \- {7 S- N8 ]( [
- # 略。。。# p* |& M% G3 X4 @. @# G+ Y8 W4 `
- 5 K, B- A# f* R8 |" v) z
- """
$ `2 T1 y( J" ` - 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
& w" [8 D" Z( ?" p2 ]+ \" C - """
复制代码
3 r2 G: f' F; V- }! R实例2 : 递归
, U. O- ?( [# u( Z4 N1 p- # 返回 x 在 arr 中的索引,如果不存在返回 -1
- U2 s7 P. R/ e) A! n5 T - def binarySearch (arr, l, r, x): / [, m6 c$ u; h8 y
- " o* i G9 E N, O! B
- # 基本判断$ z- P8 Z+ p1 b) j# ]1 N( ?) w
- if r >= l:
% Q6 p5 v& o5 `( H -
/ L( F0 ~( i% z$ b - mid = int(l + (r - l)/2)
& \9 W4 b* w- O' r - " E |& c( W& J S8 b
- # 元素整好的中间位置
7 d' @" W, R* w* k - if arr[mid] == x: 2 D$ x" k- \7 h2 y' \; s4 u
- return mid : r# t: {" P; [& d- t
- 8 \2 D9 t: _% T: F: v( ^* v+ _" ~
- # 元素小于中间位置的元素,只需要再比较左边的元素
9 Q# u; U. U. ~" p, {3 f8 `, {9 ^; \ - elif arr[mid] > x:
2 ~- I+ c4 O- t - return binarySearch(arr, l, mid-1, x) + `. J. w# b; h6 H- f9 S
- ! r, t) {3 _' ^8 t! e
- # 元素大于中间位置的元素,只需要再比较右边的元素
& }. ?9 l. x; F b6 J" j$ y: U - else:
- f/ i# Q: Z0 S# x5 k" I# }& A - return binarySearch(arr, mid+1, r, x) 3 r) n3 ^( y- a7 l' T4 u& c6 z/ F: F
-
% F& t* ]+ [) c# G: c1 p - else: $ e* ~/ i. e1 e& i
- # 不存在
8 h5 i) b+ j! h1 Z# h7 u9 M% X - return -15 I# u1 m" ?9 U
-
$ D% U+ [! e9 `% e - # 测试数组5 r, w/ u4 Z( u6 D4 C7 ~6 [
- arr = [ 2, 3, 4, 10, 40 ] ' m" k0 D6 u+ @( h0 K
- x = 10
7 A% q5 J. R( j6 `1 H -
3 e: p7 B/ D4 }) B) U# A7 B - # 函数调用
; M, B1 @6 Z7 g5 ~! G, g# J1 s - result = binarySearch(arr, 0, len(arr)-1, x)
& x0 `+ V7 D& c( i' E - / H% v) R; G2 s/ D0 A4 o
- if result != -1: * }2 k6 w2 g9 {# o) n! u9 t q
- print ("元素在数组中的索引为 %d" % result )
: d. q6 j" y& n* J5 }3 e$ x- x - else:
# Z' X9 y- g6 k - print ("元素不在数组中")
复制代码 执行以上代码输出结果为:. P& l4 D0 [; i9 _0 u- p
) l* E" l* j2 _6 N- U0 p
$ Y1 c4 u' L8 y( }1 k. J( U7 r! x% [0 ^2 y) m6 r3 ]+ K) T

/ e0 m' g+ O/ W
" V; o+ U& N8 s! y# u( p0 k7 q注:log2X+1 = ? 次 (X为序列的总元素数量) |
|