一文看懂经典排序算法之插入排序

终于开始写算法了…由于自己最生疏的就是插入排序所以先写插入= =
我们先来看下插入排序是怎么实现的
(以升序排序为例)

给出一组数如下:
1 3 5 4 2 将3与1比较 1<3所以不执行交换
接下去比较5与3 仍然不交换 接下去比较5和1
发现依旧不用交换 退出此时的循环 接下去对4进行比较 4<5 4>3 那么将3 5之间空出一个位置 将4插入3和5之间
得到1 3 4 5 2
接下去将4和3 1比较 发现不交换 退出此时的循环
接下去比较2和5 得到1 3 4 2 5
再将2与4进行比较 得到1 3 2 4 5
再往前比较得到1 2 3 4 5 最终完成后退出循环

可以想象一下洗牌的过程 不停的往前比较插入

我个人觉得难点就在于空出位置那一步= =(经常把自己搞晕了orz
来看以下代码

For i=2 to n 
t=a(i) '记录一下当前的a(i)值防止后面丢失 
j=i-1
Do while t<=a(j) '当当前数比前面数小时执行
a(j+1)=a(j) '将j位置的数赋值给后一个数 实现空出位置
j=j-1 '进行往前比较
if j=0 then exit do
loop
a(j+1)=t '将空出的位置用要插入的数补上 
next i

我们可以看出
这里的插入是会在某个位置形成两个一样的数 最后用要插入的数覆盖掉实现往后挪位的
如 1 3 5 4 2 到 1 3 5 5 2 到 1 3 4 5 2
当然如果是一串有序数插入某个数就非常简单啦 原理是一样的 都是通过标记位置实现 这里就不加赘述了
由于是属于给萌新看的小白教程(以及自己回顾)所以尽可能多的加了注释…希望有帮助
不过听说我们下一届换了一种语言学… 不过我依旧只会vb

打算下次试着写写通用技术相关捋捋思路
有不对的或者更好的建议欢迎指正交流

某只会vb6.0的不知名高中生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值