python实现的折半插入排序

def halfinsertsort(source):
    for i in range(1, len(source)):
        chosen = source[i]
        low = 0
        high = i - 1
        while low <= high:
            mid = int((low + high) / 2)
            if source[mid] <= chosen:
                low = mid + 1
            else:
                high = mid - 1
        dest = high + 1
        source[dest:i + 1] = [chosen] + source[dest:i]
    return source

print(halfinsertsort([2, 1, 4, 5, 3]))

        折半插入排序,使用折半查找的方式去给待插入数据对象找到一个位置进行插入,相比与后插法减少了比较次数,数据移动次数并没有减少,所以效率较常规的插入排序时间复杂度差不多。算法中唯一的难点在于最后取high + 1为待插入数据插入的位置。这可以通过归纳总结出来,折半查找的过程其实就是在不断缩小待插入数据应该被插入的范围,这个范围记为[low, high],当这个范围缩小到1的时候,也就是low等于high,再缩小就没法缩小了,这个时候mid等于low和high,待插入的数据,当它比source[mid]小,那么待插入数据应该插在mid的位置,mid及后面的数据应该后移,根据逻辑执行了high = mid - 1之后跳出循环,所以跳出循环之后待插入数据应该插在mid位置也就是high + 1位置。待插入数据如果它不比source[mid]小,那么应该插在mid后面,也就是mid + 1位置,根据逻辑执行了low = mid + 1之后跳出循环,high这个时候没变等于mid,因此跳出循环之后待插入数据应该插在high + 1位置。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

__空无一人__

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

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

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

打赏作者

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

抵扣说明:

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

余额充值