2.1 插入排序 基本原理类似扑克码牌
for循环以 j 变量遍历第二张牌到最后一张牌(元素个数n) ,将 j 值储存在 key 上。新建 i 变量为 j-1 ,即是 j 之前的牌里的最后一张。(假设之前的牌已排好序,那么最后一张牌的数最大)
如果 j 这张牌的 key 值比i这张牌的值大,那么他也一定比所有j前面的值大,也就不需要一个一个比较,直接插入到数组的最后。
for j =2 to A.length
key = A[j]
//Insert A[j] into the sorted sequence A[1..j-1]
i = j-1
然后开始进入 while 循环与j之前的牌从右到左比大小,这个前面所有的牌即用i变量(用 i-1 遍历)表示,确定 i 的范围,为 1 <= i <= j-1,如果 j 这张牌的 key 值比 i 这张牌的值小,则将前面的值赋给后面。
如果 j 这张牌的 key 值比 i 这张牌的值大,那就停止 while 循环。所以 while 循环需要同时满足 i > 0,以及 key 比 A[i] 小,这两个条件,用 and (且)连接。
最后把 j 的 key 值赋给停在 i 的右边牌上。
while i >0 and A[i] > key
A[i+1] = A[i]
i = i-1
A[i+1] = key
接着进入下一个for循环中... 直至到最后一张牌。
伪代码:
for j =2 to A.length
key = A[j]
//Insert A[j] into the sorted sequence A[1..j-1]
i = j-1
while i >0 and A[i] > key
A[i+1] = A[i]
i = i-1
A[i+1] = key
教材图: