基本算法——折半插入排序(Python)

本文详细介绍了折半插入排序的概念、具体操作流程,并通过图示和Python代码实现了对数组{4,2,8,0,5,7,1,3,6,9}

活动地址:优快云21天学习挑战赛

1.折半插入排序(Binary Insertion Sort)

1.1 概念:

是对插入排序算法的一种改进。所谓插入排序,就是不断的依次将元素插入前面已排好序的序列中。由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。

1.2 具体操作:

在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high]。将待插入元素与a[mid](其中mid=low+(high-low)/2)相比较,如果比参考元素小,则选择a[low]到a[mid-1]为新的插入区域(即high=mid-1),否则选择a[mid+1]到a[high]为新的插入区域(即low=mid+1),如此直至low<=high不成立,即将high+1位置及之后所有元素后移一位,并将新元素插入a[high+1]。寻找插入点的二分查找算法见下图:
在这里插入图片描述

2.图示

使用折半插入排序算法将数组 { 4,2,8,0,5,7,1,3,6,9 } 进行升序排序。

在这里插入图片描述

3.代码实现(python):

import copy
# 折半插入排序
def binary_insert_sort(lst):
    for i in range(1, len(lst)):
        if i == 1:
            order_area = lst[:i]
        else:
            order_area = ordered

        pos = get_pos(order_area , lst[i])
        print(pos)
        order_area.insert(pos, lst[i])
        ordered = copy.deepcopy(order_area)
        print("插入后的有序列表为:" + str(ordered))



def get_pos(ordered, target):
    low = 0
    high = len(ordered) - 1
    while low < high:
        mid = (low + high) // 2
        if target < ordered[mid]:
            high = mid - 1
        elif target > ordered[mid]:
            low = mid + 1
        else:
            return mid
    else:
        mid = (low + high) // 2
        if target > ordered[mid]:
            return mid + 1
        else:
            if mid == 0:
                return 0
            else:
                return mid


lst = [4, 2, 8, 0, 5, 7, 1, 3, 6, 9]
binary_insert_sort(lst)

注意:列表中的元素必须保持有序,否则不符合二分查找的要求。

4.算法性能

4.1 时间复杂度:

折半插入排序算法比直接插入排序算法明显减少了关键字之间比较的次数,因此速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为   O ( n 2 ) \ O(n^2)  O(n2),与直接插入排序算法相同。

4.2 稳定性:

由于在比较的时候,对于两个相等的元素,不会进行移动,排序完成后,相同元素之间的先后顺序不变,所以折半插入排序算法是一种稳定的排序算法,如下图所示。
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值