算法绘本-插入排序

插入排序有点像打麻将时给麻将牌排序,其原理是假定一个有序区和一个无序区,一开始将给定的一系列值的第一个放到有序区,剩下的值放到无序区,然后从无序区取出第一个值,从后向前和有序区的值比较,找到它应该存在的位置(大于等于左边,小于右边)插入进去。然后再取出无序区的第一个值从后向前和有序区的值比较,找到属于它的位置,如此反复,直到无序区没有值了为止。

举个例子,假定有6,1,7,4,1,9,2这几个数字需要排序

image-20240407221228742.png

首先,假定一个有序区和一个无序区,将上面的数字中的第一个放到有序区,其余的放到无序区。

image-20240407222112534.png

第一轮,取出无序区的第一个数字1,和有序区的数字比较,有序区现在只有一个数字6,所以用1和6比较

image-20240407222344392.png

因为1比6小,所以数字1应该插入到数字6的前面,第一轮结束

image-20240407222600472.png

第二轮,取出无序区的第一个数字7,和有序区的倒数第一个数字6比较

image-20240407223322108.png

因为数字7大于数字6,所以将数字7插入到数字6的后面,第二轮结束

image-20240407223432290.png

第三轮,再取出无序区的第一个数字4,和有序区的倒数第一个数字7比较

image-20240407223554452.png

因为数字4小于数字7,所以继续往前遍历有序区,用数字4和有序区倒数第二个数字6比较

image-20240407223711636.png

因为数字4小于数字6,所以继续往前遍历有序区,用数字4和有序区倒数第三个数字1比较

image-20240407223801775.png

因为数字4大于数字1,所以将数字4插入到数字1的后面,第三轮结束

image-20240407223848983.png

第四轮,再从无序区取出第一个数字1,和有序区的倒数第一个数字7比较

image-20240408064654546.png

因为1比7小,所以继续遍历有序区,和有序区的倒数第二个数字6比较

image-20240408064748866.png

因为1比6小,所以继续遍历有序区,和有序区的倒数第三个数字4比较

image-20240408064836555.png

因为1比4小,所以继续遍历有序区,和有序区的倒数第四个数字1比较

image-20240408064923442.png

因为1等于1,所以将1插入到有序区倒数第四个数字1的后面,第四轮结束

image-20240408065009905.png

第五轮,继续从无序区取出第一个数字9,和有序区倒数第一个数字7比较

image-20240408065114113.png

因为数字9比数字7大,所以将数字9插入到数字7的后面,第五轮结束

image-20240408065153617.png

第六轮,再从无序区取出第一个数字2,和有序区的倒数第一个数字9比较

image-20240408065308843.png

因为2比9小,所以继续遍历有序区,和有序区的倒数第二个数字7比较

image-20240408065354235.png

因为2比7小,所以继续遍历有序区,和有序区的倒数第三个数字6比较

image-20240408065433247.png

因为2比6小,所以继续遍历有序区,和有序区的倒数第四个数字4比较

image-20240408065513303.png

因为2比4小,所以继续遍历有序区,和有序区的倒数第五个数字1比较

image-20240408065559491.png

因为2比1大,所以将数字2插入到数字1后面,第六轮结束

image-20240408065642408.png

这时候,无序区没有值了,排序结束,有序区的数字顺序就是排序好的顺序。

所以对于给定n个值,插入排序可以总结出一下几点:

  • 需要进行n-1轮比较
  • 最坏的情况下(每次都需要比较完有序区的所有数字),第k轮需要比较k次,共需要比较1+2+3+…+n-1次,所以最坏情况下时间复杂度是O(n^2)
  • 因为只需要一个额外空间来完成数字交换,所以空间复杂度是O(1)
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值