基本思想
每一步将待排序的元素,按照其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去,直到元素全部插完为止(可以想象打牌的场景,每拿到一张牌,就要找到合适的位置,然后把牌插进去)。
具体算法实现
假设现有 n 个待排序的元素,对应的关键字分别为 a1、a2、……..an,因为第一个元素是有序的,所以从第二个元素开始,将 a2 与 a1 进行比较。若 a2 < a1,则将 a2 插入到 a1 之前;否则,说明已经有序,不需要移动 a2。
现在有序的元素变为2个,再从第三个元素 a3 开始,先和 a2 进行比较,若 a3小于a2,再将 a3 和 a1 进行比较,若 a3小于a1,则将 a3 插入到 a1 的前面;否则,说明已经有序,继续插入下一个元素。
但是,这个算法还存在一点bug,如果 a3大于a1 呢?这时我们就会想到搬移元素了,即先将要进行插入的元素附给变量 key ,用 key 和已经排好序的元素依次进行比较;像上面的问题,就可以先让 a2 搬移到 key 的位置,再将 key 插入。
(图画的比较丑,多多包涵啦)按照上述方法,直到最后一个元素插入完成。(整个过程可以想象成打牌,每拿到一张