二分法适合在闭区间中查找,所以本文排除了目标超出数值范围的情况,至于目标在列表中有对应元素的情况,用内置函数会方便很多,所以本文主要是针对目标在数组间隙位置的情况,利用二分法进行查找,具体来说:
若目标在数组中,直接返回其索引(若目标对应元素有重复,则返回相同元素位置范围);
若目标超出了列表数值范围,返回0,或者数组长度;
若目标在数组间隙位置,则返回其加入数组但不改变数组排序的索引值。
ps:新手一枚,不足之处,敬请赞之→ _ →
解题思路
1)简单说二分查找就是一个切片查找的过程,通过对比目标(t)和中点值(m)[0]的大小决定是下一级查找是向左还是向右。
如:原数组[a,b, …,m,c,…,d],若 t > m, 则在下级数组[m,c, … ,d]中继续找中点m1,若 t < m, 则在下级数组[a,b, …,m]中继续找中点m1,如此反复,直到中点和端点相邻,就可以确定目标位置。
[0]:中点索引通过数组的端点(left和right)索引之和除以2取整获得:
m=(left+right)//2
2)具体程序如下,函数版简单粗暴直接上二分查找,完整版最初是因为数组排序和右端点初始值的获取只需一次,而查找需要迭代,两者矛盾,所以就引入了类,发现效果好像不是很好,简单程序还是直接使用函数方便,这次权当是类的演练吧。除了上面提到的初始化问题,结合文章开头的分析于是就有了完整版。
程序
函数版:
def search(thelist, target, right, left=0):
mid_index = (left + right) // 2
mid_value = thelist[mid_index]
if target == mid_value:
return mid_index
if target < mid_value:
if mid_index - left <= 1:
if target < thelist[left]:
result = left
else:
result = left + 1
return result
else:
right = mid_index
return gap_search(thelist,