数据结构--知识点10--插入算法

1、定义

对一个序列进行从小到大排序,将这个序列分为有序序列和无序序列,首先将第一个元素放入有序序列,剩下的都属于无序序列;然后选择无序序列中第一个与有序序列中的比较,如果小则放前面,大则放后面;然后这两个排好序的为有序序列,剩下的为无序序列,再在无序序列中选择第一个,插入有序序列中的合适位置;以此类推,一个个将剩下的元素插入有序序列中,最后得到一个有序序列。
其中插入时,先从有序序列的最后一个进行比较,一个个向前比较。

2、python实现

def insert_sort(alist):
    n=len(alist)
    for j in range(1,n):
        # 表示从右边的无序序列中一共取出多少个元素执行这样的过程
        # i表示内层循环起始值
        i = j
        while i > 0:
            # 内层循环
            # 执行从右边的无序序列中取出第一个元素,即i位置的元素,
            # 然后将其插入到前面的正确位置中(通过和前面元素一个个比较插入)
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1]=alist[i-1],alist[i]
                i -= 1
            else:
                # 表示如果i元素比前一个元素大,就不一个个进行比较,直接退出进行下一个
                # 这样对于一个有序序列来说,时间复杂度就为n
                # 而且对于等值的两个元素,不会进行交换,因此是稳定的排序算法
                break

if __name__ == '__main__':
    list=[11,32,1,45,98,67,5,44,75]
    print(list)
    insert_sort(list)
    print(list)

结果:

[11, 32, 1, 45, 98, 67, 5, 44, 75]
[1, 5, 11, 32, 44, 45, 67, 75, 98]

3、时间复杂度

  • 最优时间复杂度:O(n)(升序排列,序列已处于升序状态)
  • 最坏时间复杂度:O(n2)
  • 稳定性:稳定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值