二分查找算法学习历程,首先是学习到了折半插入排序过程了解到二分思想,
就看了看二分查找,用的语言是python
这个算法我属于是一看就会,一写就蒙圈
我刚开始写出现几个点
1:定义mid的位置不清晰,我还放在了循环外面
2:mid怎么赋值不熟悉,我因为对半查找,我直接以为长度整除2呢然后考虑了半天奇数偶数个元素个数的问题,。。
3:循环条件不明朗。感觉随心而欲来的,看感觉写的 left<=right 或者 left<right 。
4:最后一个问题就是,一开始写的时候我居然犹豫了疑惑的发现我返回什么呢最后???我没有记录下标啊,迷惑,很久才想清楚最后的mid就是查找值的下标。
废话不多说,一个一个解决问题
mid是一个变化的值,会改变位置,肯定要放入循环更新值啊,我有点傻乎乎了。
mid既然变化,那么赋值,也肯定和变化的左右区间有关,和数组一个长度,不变的量肯定无关。
所以就写为 mid=(right-left)//2,但是很迷惑,运行不了,有问题,学习过程中,看见一个弹幕说的,防止越界应该 mid=left+(right-left)//2 说实话我还是有点懵逼。防止越界什么鬼??????因为调试不太熟练,,,举了不少例子。如果最后剩下3个,元素,假设下标为
3 4 5,,,,,计算下来,mid应该等于4,显然(5-3)//2=1不符合,所以要加上了left的下标,,虽然不是很理解怎么思考出来的。但是我可能懂了吧
循环条件: left<=right 或者 left<right 。其实都可以,经过在算法随笔录上面的学习我是明白了,
涉及一个情况,无非就是有一个等于的情况,,如果right=长度-1,那么就要写等于,因为你的right下标是有意义的,是数组最后一个值,当nums[mid]>target的时候,right=mid-1,此时 sums[mid]必然不等于target
这里用函数的形式,把代码写出来,
def HalfReaser(nums,target):
n=len(nums)
left=0
right=n-1
while left<=right:
mid=left+(right-left)//2
if nums[mid]>target:
right=mid-1
elif nums[mid]<target:
left=mid+1
else:
return mid
return -1
nums=[-1,0,3,5,9,12]
t=9
print(HalfReaser(nums,t))
第二种,
def HalfReaser2(nums,target):
left=0
n=len(nums)
right=n
while left<right:
mid=left+(right-left)//2
if nums[mid]>target:
right=mid
elif nums[mid]<target:
left=mid+1
else:
return mid
return -1
nums=[-1,0,3,5,9,12]
t=9
print(HalfReaser2(nums,t))