二分查找

  • 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后 fp 两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
 1 #使用循环实现二分法(非递归)
 2 def binary_search(alist,v):
 3     n=len(alist)
 4     start=0
 5     end=n-1
 6     while start<=end:
 7         mid=(start+end)//2
 8         #判断中间值与比较的值v
 9         if alist[mid] == v:
10             return True
11         elif alist[mid] > v: #左边列表查找
12             end=mid-1
13         else:
14             start=mid+1
15     return False
16 
17 #递归方式实现
18 def binary_search2(alist,v):
19     n=len(alist)
20     #递归出口
21     if n==0:
22         return False
23     mid=n//2
24     if alist[mid] == v:
25         return True
26     elif alist[mid] < v: #右边列表查找
27         return binary_search(alist[mid+1:],v)
28     else :
29         return  binary_search(alist[0:mid],v)
30 
31 if __name__ == '__main__':
32     alist=[1,2,3,4,5,6,7,8,9]
33     print(binary_search(alist,9))
34     print(binary_search(alist,19))
35     print(binary_search2(alist,9))
36     print(binary_search2(alist,19))

 

posted @ 2020-04-22 22:42  小他_W  阅读(154)  评论(0编辑  收藏  举报