二分法搜索算法

今天看书时,书上提到二分法虽然道理简单,大家一听就明白但是真正能一次性写出别出错的实现还是比较难的,即使给了你充足的时间,比如1小时。如果你不是特别认真的话,可能还是会出一些这样那样的错误,所以就尝试了自己去实现一下,看能否一次通过,结果自然不言而喻,虽然用的时间不长,但是我失败了,呵呵。

个人觉得失败的最主要原因是自己没有认真的先想好这个思路和可能出现的分支情况,而是直接凭主观臆想就去写代码了,完全正中书上所说的行为,所以也如书上所说,出错了。后经调试应该是得到了基本的正确算法,内容如下:

#!/usr/bin/env python
#encoding: utf-8

def half_search(search_arr, search_str):
    lb = 0
    ub = len(search_arr) - 1
    for i in range(ub/2 + 1):
        if lb > ub:
            return -1
        mid = (ub + lb)/2
        if search_arr[mid] == search_str:
            return mid
        elif search_arr[mid] > search_str:
            ub = mid - 1
        else:
            lb = mid + 1
    
if __name__=='__main__':
    arr = [10,20,30,40,50,60,70]
    print half_search(arr, 1)
    print half_search(arr, 11)
    print half_search(arr, 22)
    print half_search(arr, 33)
    print half_search(arr, 40)
    print half_search(arr, 55)
    print half_search(arr, 66)
    print half_search(arr, 70)
    print half_search(arr, 8)

结果:

-1
-1
-1
-1
3
-1
-1
6
-1
正整数代表在数组中的下标,3那就是第4个位置;-1代表不存在


总结:

实现简单的算法之前,如果已经有了一套最简易的实现【比如直接打印100条相似的内容】,不妨要想想是否还有更精巧的实现【可否用循环+参数化替代】;实现稍微复杂点的算法时,不妨先在纸上画出各种可能的验证情况,避免实现是缺胳膊短腿的;还有一点就是算法什么的还是要多练,不然稍微复杂的过一阵可能就会忘记细节了。我想这就叫术业有专攻吧!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上帝De助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值