插入排序详解及代码实现

插入排序(直接插入排序) :假设有待排序表L[1...n]:

有序序列L[1...i-1]L(i)无序序列L[i=1...n]

算法思想:初始假定L[1]是一个已经排好序的子序列,然后将L(2)~L(n)依次插入到前面已排好序的子序列,执行该操作n-1次就能得到一个有序表,在从后向前的比较过程中,需要反复把已排序元素逐步向后移位,为新元素提供插入空间

def insert_sort(alist):
 n=len(alist)
 for j in range(1,n):
    for i in range(j,0,-1): # i:j,j-1,j-2,...,1
        if alist[i]<alist[i-1]:
            alist[i],alist[i-1]=alist[i-1],alist[i]
        else:
            break
if __name__ == '__main__':
    list=[12,3,5,15,67,35,22,69,78]
    print("原始序列为:%s"%list)
    insert_sort(list)
    print("排序后的序列为:%s"%list)

插入排序算法性能分析:
空间复杂度:仅使用了常数个辅助单元,因而空间复杂度为O(1)

时间复杂度:

(1)最好时间复杂度O(n):最好情况下,表中元素已经有序,此时每插入一个元素,都只需比较一次而不用移动元素。

(2)最坏时间复杂度O(n^2):最坏情况下,表中元素序列与排序结果相反时,总的比较次数达到最大,i=2,3,...n,总的移动次数也达到最大,i=2,...n对i+1求和。

稳定性:

 稳定:每次插入元素时总是从后向前先比较再移动,因此不会出现相同元素相对位置发生变化的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值