折半插入排序

本文介绍了一种改进的插入排序算法——折半插入排序。该算法通过减少元素比较次数提高效率,采用折半查找确定待插入元素的位置,并一次性移动元素进行插入。尽管时间复杂度仍为O(n^2),但其稳定性使其适用于某些特定场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 折半插入排序是在直接插入排序的基础上改进的,在直接插入排序算法中,总是边比较边移动元素,而折半插入排序则是将比较和和移动元素的操作分离出来:先折半查找出元素的待插入排序位置,然后统一的移动待插入位置之后的所有元素

def binary_insert(alist):
    for i in range(1, len(alist)):
        index= alist[i]#将alist[i]暂存到index中
        low = 0
        high = i - 1 #设置折半查找的范围
        while low <= high:
            mid = (low + high) // 2 #取中间点
            if idx > alist[mid]:#查找右半部分
                low = mid + 1
            else:
                high = mid - 1#查找左半部分
        # 跳出循环后 low==mid,high = low - 1
        for j in range(i, low, -1):
            alist[j] = alist[j - 1]#统一后移元素,空出插入位置
        alist[low] =index#插入操作
    return alist

if __name__ == '__main__':
    a = [5,1,4,8,10,7,6,2,3,9]
    print(binary_insert(a))

 折半插入排序仅仅是减少了元素比较元素的次数,该比较次数与待排序列表的初始状态无关,仅取决于表中元素个数,而元素移动的次数没有变,它依赖于待排序列表的初始状态,因此折半插入排序的hi时间复杂度仍为O(n^2),它是一个稳定的排序算法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值