二分搜索
对已经排好序的n个元素a[0:n-1],现在要在这n个元素中找出一个特定元素。
首先比较容易想到的方法是顺序搜索,逐个比较a[0:n-1]中的元素,知道找到某个元素,或者搜索完整个数组后确定x不在其中。
然而,这个方法没有很好的利用n个排好顺序的元素这个条件。最坏的情况下需要O(n)次比较。
二分搜索方法充分利用了元素间的位置关系,采用分治策略,可在最坏的情况下用O(log n)时间内完成搜索任务。
其基本思想是,将n个元素分成个数大致相同的两半,去中间值a[n/2]与x做比较。如果x与a[n/2]相等,则找到x,算法终止。如果x比较大,说明x可能在数组的右半段,则在数组的右半段继续搜索。如果x比较小,说明x可能在数组的左半端,则在数组的左半段继续搜索。
增加点稍许难度,程序需要完成如下任务:
1. 如果需要搜索的数值在数组中,则返回索引值
2. 如果不在其中,则将搜索的数值,添加到数组中的正确位置,使得数组中的元素还是按照递增的顺序。
import numpy as np
arr=np.random.randint(10,size=5).tolist()
arr.sort()
print(arr)
def binarySearch(arr,x):
left=0
right=len(arr)-1
while left<=right:
middle=int((left+right)/2)
if x==arr[middle]:
return arr.index(x)
elif x>arr[middle]:
left=middle+1
else:
right=middle-1
arr.insert(left,x)
return arr
print(binarySearch(arr, 1))
最后主要需要注意的是,搜索停止的条件。x不在数组中,最后一次搜索的状况如下图。

若x>arr[middle],则left的索引位置变为蓝色笔所写的位置,说明数组中right索引左侧所有元素都比x小,left右侧(包含left)所有元素都比x大,则left为插入x的索引位置。