最近在複習算法導論,總結一下經驗蛤
插入排序的模式就像是排序一手撲克牌 , 設總共牌庫數量爲n 當前抽中的牌下標爲 i, 有如下論證java
整個過程能夠歸納爲:算法
從剩餘牌庫中依次循環抽取牌,循環n-1
次, 抽取中的牌依次比較手中牌的大小,循環次數不定( 由於手中牌是有序的,比較成功就會退出循環 ),最多爲i-1
次
使用Java實現算法則爲:數組
public class InsertionSort { public static int[] sort(int[] p) { for (int i = 1; i < p.length; i++) { int currentValue = p[i]; int index = i; while (index > 0 && currentValue < p[index - 1] ) { int a = 0; a = p[index]; p[index] = p[index - 1]; p[index - 1] = a; index--; } } return p; } public static void main(String[] args) { int[] b = InsertionSort.sort(new int[]{5, 2, 4, 6, 1, 3}); for (int i : b) { System.out.println(i); } } }
根據循環不變式
能夠驗證以上代碼( 使用上面代碼的變量 )測試
i=1
時證實循環不變式成立, 手中牌爲5,單個元素,排序天然成立.手中牌: [5] [2,5] 正在抽中的牌: [2] [4] 牌庫中的牌: [4,6,1,3] [6,1,3]
i < p.length
, i = 1, i ++, 必有i > p.length的一刻,認定排序了整個數組.在內層排序手中牌的循環終止緣由是index > 0 && currentValue < p[index - 1]
index是當前的手牌下標(下標從1開始), index--;必有index <= 0的一刻,認定排序了整個手中牌數組