基础算法——插入排序

插入排序算法的思路其实和玩扑克牌一样,当我拿到一副牌后,我都会下意识地把小的牌抽出来,插到左边的一侧去,把大的牌抽出来,再插到右边的一侧去,反复操作几次,一副牌的顺序就被排好了,而插入算法的原理也是如此。

2da6f249c366452a8dbed88dc40876fe.png

比如你拿到这样“一副牌”:[4,3,1,5,7,6,2],我们现在使用插入排序的思路对这副“牌”进行从小到大的排序。

我们现在来模拟抓牌的过程:

第一次拿到的牌是4,现在把它握到手里不动,

第二次拿到的牌是3,比4小,所以把它放到4前面,手里的牌是[3,4,1,5,7,6,2],

第三次拿到的牌是1,比3和4都小,所以放在最前面,手里的牌是[1,3,4,5,7,6,2],

第四次拿到的牌是5,比1,3,4大,所以原地不动,手里的牌是[1,3,4,5,7,6,2],

第五次拿到的牌是7,比1,3,4,5都大,所以原地不动,手里的牌是[1,3,4,5,7,6,2],

第六次拿到的牌是6,比7小,比5大,所以放在5,7之间,手里的牌是[1,3,4,5,6,7,2],

第七次拿到的牌是2,比3小,比1大,所以放在1,3之间,手里的牌是[1,2,3,4,5,6,7],

(有人喜欢用动画的方式演示,各种柱形图飞来飞去的,我看得眼花,我更喜欢用语言和数列展示,这样更容易发现规律)

现在开始代码实现(Python):

a=[4,3,1,5,7,6,2]

for i in range(1, len(a)):
    value = a[i]
    j = i - 1
    while value < a[j] and j >= 0:
        # 如果a[i]比a[j]小,则将a[j]元素依次往右面的a[j+1]复制,这样会把a[i]的值覆盖掉
        a[j + 1] = a[j]
        j -= 1
# 全部复制完,但a[i]被覆盖了,好在我们最开始用value保存了a[i],所以最后将a[i]放到最前面的位置
    a[j + 1] = value
print(a)

选择排序与插入排序的区别:

选择排序的时间复杂度是稳定的O(n^{2})

插入排序的时间复杂度最差的情况是O(n^{2}),如果数组本身有序,其时间复杂度为O(n)。

这也是插入排序的在某些情况下的优势。

总结:在数组中大部分元素都有序的业务场景,适合使用插入排序。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值