二分

文章目录

二分

代码实现

  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)
上一篇:NOIP信息学1028:字符菱形--信息学一本通(c++)


下一篇:Lc222_完全二叉树的节点个数