关于裤衩子被看穿之二分查找算法

二分查找算法学习历程,首先是学习到了折半插入排序过程了解到二分思想,

就看了看二分查找,用的语言是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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值