输入(Input): n个数的一个系列<A1, A2......An-1,An>,如输入3,5,1,8,7,6,4,2
输出(Output): 一个有序的排列,满足A1<A2<A3......An-1<An ,输出1,,2,3,4,5,6,7,8
插入排序的工作方式类似于排序一手扑克牌,刚开始的时候我们左手的牌的数目为0,然后一张张的从台面上拿起牌并有序的插入到左手中,如下图
如上图所示,为了将牌插入到正确的位置,需要将左手已经排好顺序的每张牌依次从右到左与将要插入的牌作对比,当第一次找到比将要插入的牌小的时候,则将牌插入这张牌的后面(右边),下面是这个将牌插入正确位置的伪代码(下面的1-8行伪代码来源于《算法导论》);
第1行:J表示正在插入到手中的当前牌,因为拿第一张牌不需要比较(想想从桌面上拿第一章牌时的情景),所以j值取2到A.length
for循环依次取桌面的牌
第2行:key临时存储正在插入的牌(值)
第4行:J-1表示左手中已经排好序的最右边的牌(最大的牌)
第5,6,7行:while循环查找插入的正确位置。while i>1 and A[1..j-1],实际上应该是i>=1,否则的
话,最左边的牌(在数组的最低位)会跳过比较,如输入【2,6,1,8,5,4,7】输出结果
会是【2,1,3,4,5,6,7,8】
第8行:将牌(值)插入
下面是c代码实现
加入main和打印函数测试:
编译:
执行并查看是否达到要求:
ok !