二分

二分

代码实现

  1. 在有序的序列中插入数值,完成插入后的序列保证其有序
    def insert_sort(orderlist, i):
        ret = orderlist[:]
        low = 0
        hight = len(ret)#去掉减一,不影响整除2
        while low < hight:
            mid = (low + hight) // 2
            if ret[mid] < i:
                low = mid + 1  # 加1保证不会进入死循环
            else:
                hight = mid  # 此处加减一不合适,加一增大原已经缩小的范围,减一会使数值插入错误,比如数值大于hight索引处的值,在hight索引处插入反而跑到该索引处值的前面
        print(low, i)
        ret.insert(low, i)
        #数据插入式往后面挤,当数值处于ret[mid]和ret[mid + 1]之间时,最终hight=low=mid+1,
        #所以插入后正好在ret[mid]和ret[mid + 1]之间
        return ret
    
    lst = [2,3,5,6,7,8,9,10,11,12,13]
    newlist = sorted(lst)
    
    for x in (14,5):
        newlist = insert_sort(newlist, x)
        print(newlist)
    

总结

  1. hight-1后如果一个比当前的序列还大的数值插入,当条件退出时,low=hight索引只能取到length-1,相当于在最后一个值的索引上插入数据,最后一个数据被往后面挤;取消减1,low可以取到length,相当于尾部追加.
  2. 算法核心:就是折半至重合为止
  3. 二分的前提是有序, 否则不可二分
  4. 二分查找算法的时间复杂度是O(logn)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值