|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
二分搜索 是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 5 z0 ~: |4 H4 |
. o7 I B8 O1 g1 i- """
1 D& l g& O6 B' x# c" q - 顺序查找经典案例1
4 g* K3 k I) J1 G5 `' `; y - 素材来自新大榭Python学习社区,帖子号:7124#- |+ w8 i9 P) q' {
- 首页 http://www.daxie.net.cn/py/ ) w' z+ J$ z ]: s" p
- """8 k1 R+ S4 R; D" A
- a=[1,3,4,6,7,8,10,13,14] #待查找的数组a,升序排列
* o& O$ P* w- }' V7 W" q) L& U# n - key=int(input("要查找的数据为:")) #输入待查的目标数据key
9 o% j4 k6 H/ Q6 w9 Z: v - L=0 #最开始的比较范围从a[0]开始,故设定左边界下标为0/ S4 ]! a: E' D
- R=len(a)-1 #最开始的比较范围到a[len(a)-1]结束,故右边界下标为len(a)-1
9 @ G, j. f) t" p- n - flag=False #初始化定义没有找到时的值为False
& T- f$ s. k5 V( C - while L<=R: #左边界小于有边界,即当范围内有数据时
}3 I+ h# `+ G! M - m=(L+R)//2 #取中间元素的下标m
8 _1 z4 J) t& p3 i; V - if a[m]==key: #比较中间元素与key,若相等4 L7 o1 S. o; c/ B# m$ o* ]0 H
- flag=True #满足相等条件,即成功找到元素
% U% V# Q- z; b, D - break #结束循环,退出循环
! e; u2 T( H" L - if key<a[m]: #如果key比中间元素a[m]小; z. g" M- d$ z. {
- R=m-1 #右边界改为m左边一位的元素(m已经被比较不用划入范围)
# ~9 Z+ @6 x n. _ - else: #否则(key比中间元素大)
# X. q8 U+ B0 z* T" k - L=m+1 #左边界改为m右边一位的元素4 ^% X0 ^+ y1 d% ?8 K1 Z+ Y
- if flag==True:& p P0 U# F7 O2 E2 i$ j
- print("key=",key,"在序列a[",m,"]中,","查找成功!") #成功查找的状态,输出查找成功
/ U1 @. @! s7 m4 Z - else:9 K- I1 ~2 K6 r3 @
- print("查找失败") #未找到的状态,输出查找失败
9 q$ v6 H, \6 [6 R# \* b
( M$ ~9 X5 ?/ x' C- #【分析思考】+ k2 t$ j. d6 D/ \
- # 略。。。
/ G7 V4 E1 y3 Y" g9 d0 V8 }' v - / ^4 ]0 w9 ~ ]% l+ s+ w2 E8 ?
- """
& C! a8 I; n6 W4 M2 |& M3 p- x - 注:选择性必修1配套资料《辅助衔接手册》P29 范例4
; L( h" D2 f$ H9 l+ b5 G - """
复制代码
# E Q- q5 b6 ?' k- N实例2 : 递归
8 \+ E' ^" O5 j4 U0 n- # 返回 x 在 arr 中的索引,如果不存在返回 -1
. D J3 O3 V9 F; Z" h' } - def binarySearch (arr, l, r, x):
2 P; g+ o% k! N! ~6 L, W - , A) I- U: m [8 R% b% H4 W
- # 基本判断( n& X. {, |# n; c9 \
- if r >= l: + x( j3 m, v! U9 n+ x2 s, s1 {- p
- . |4 B- j2 v4 E" b
- mid = int(l + (r - l)/2), |( f! P. n* }
- - W# R6 Y% e5 a1 U# x* e8 v
- # 元素整好的中间位置
7 s0 h3 J% l0 j$ ~& z n - if arr[mid] == x:
" s( r, U' Y$ f: @" ~ - return mid ! N) m' q8 c& p; I9 z$ v9 D/ R
-
* n& _; ?/ @! R - # 元素小于中间位置的元素,只需要再比较左边的元素5 Z1 V$ R2 b' s5 U
- elif arr[mid] > x:
( g# n8 L. e: b' E) U - return binarySearch(arr, l, mid-1, x) ! N ^: |+ K0 L {
-
! M9 s( N* S' @2 a) t - # 元素大于中间位置的元素,只需要再比较右边的元素6 [4 p( v/ Z5 W& l& e, C% ?7 \
- else: * Y+ |* n. N) {5 M( L% ~8 [& g
- return binarySearch(arr, mid+1, r, x) % l. p, L# Z& m% F
-
& s5 E% l0 U' {( i& a - else:
9 H2 a7 N* i( u* G X, z" ` - # 不存在
6 C4 a2 _& q2 g4 s' W* Z* G - return -1
* c ]: V9 I. e' P) r! Q -
+ l/ _* n1 Z4 X7 N$ r$ @1 d - # 测试数组) B& a1 t$ x4 q% O0 R$ z
- arr = [ 2, 3, 4, 10, 40 ] . e9 U$ H( Z1 l2 j% A: X" g9 n
- x = 10" s v- L2 L K' L+ ]2 Q
- + X: R. [7 c) |% `, [8 s p( h
- # 函数调用
+ }: H) ]" Y9 m4 \/ h2 F - result = binarySearch(arr, 0, len(arr)-1, x) : a: m& i! S& p- Q x
-
1 E% @$ J& X5 w% _ - if result != -1:
1 B! u/ \* s3 m+ v) Q, |- ^ - print ("元素在数组中的索引为 %d" % result )% e/ }! I8 v0 T4 E6 V! z! z% l {
- else:
- K: n( {8 U% i7 _ - print ("元素不在数组中")
复制代码 执行以上代码输出结果为:4 S/ _* |% {7 G4 a( J
* k4 h, ?( b) n) _
" \, h9 H# T& e3 |5 j
# l! Y- P, t( P( I: D 3 p! W x" P+ z+ \+ W" G( Y1 D9 }3 x2 Z
1 L* A( w) e) I) P5 x. m
注:log2X+1 = ? 次 (X为序列的总元素数量) |
|