问题描述
N个有序整数数列已放在一维数组中, 利用二分查找法查找整数m在数组中的位置。 如果找到,则输出其下标值,反之,则输出‘Not be found!’
问题分析
二分法只适用于有序序列
基本算法是:每次查找前先确定数组中待查的范围。假设指针low和high(low<high)分别知识待查范围的下届和上界,指针mid知识待查范围的中间位置,即mid=(low+high)/ 2 ,把m与中间位置mid上元素的值进行比较,如果m的值大于中间位置上的元素的值, 则下一次的查找范围放在中间位置之后的元素中;反之,下一次查找范围放在中间位置之前的元素中。直到low》high, 查找结束。
算法设计
按照取值范围可知指针low和high的初始值为0 和N-1, 除了三个指针变量low,high,mid之外,还需要一个变量假设为k来记录下标,利用变量k 的值来判断整数m是否在所给出的数组中。
Code
# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 折半查找
import time
# add timer to calculate the performance
# Basic performance
###############################################################
start = time.time()
if __name__=='__main__':
a=[-3,4,7,9,13,45,67,89,100,180]
low=0
high=len(a)-1
k=-1
print('a数组中的数据如下:')
for i in a:
print(i,end=' ')
print()
m=int(input('Enter m =:'))
while low <= high:
mid=(low+high)//2
if m<a[mid]:
high=mid-1
else:
if m>a[mid]:
low=mid+1
else:
k=mid
break
if k>=0:
print('m=%d,index=%d' %(m,k))
else:
print('Not be found!')
end = time.time()
print("The Basic Runtime is {0}".format((end-start)))
结果:
a数组中的数据如下:
-3 4 7 9 13 45 67 89 100 180
Enter m =:100
m=100,index=8
The Basic Runtime is 5.093456268310547
问题拓展 - 顺序查找
# !/user/bin/python3
# -*- coding: utf-8 -*-
# @author: HHVic
# @desc: 折半查找
import time
# add timer to calculate the performance
# Basic performance
###############################################################
start = time.time()
if __name__=='__main__':
a=[-3,4,7,9,13,45,67,89,100,180]
k=-1
print('a数组中的数据如下:')
for i in a:
print(i,end=' ')
print()
m=int(input('Enter m =:'))
i=0
while i<len(a):
if m==a[i]:
k=i
break
i+=1
if k>=0:
print('m=%d,index=%d' %(m,k))
else:
print('Not be found!')
end = time.time()
print("The Basic Runtime is {0}".format((end-start)))
结果:
python
a数组中的数据如下:
-3 4 7 9 13 45 67 89 100 180
Enter m =:67
m=67,index=6
The Basic Runtime is 5.51863694190979