算法:插入排序

插入排序

最近在複習算法導論,總結一下經驗蛤

插入排序的模式就像是排序一手撲克牌 , 設總共牌庫數量爲n 當前抽中的牌下標爲 i, 有如下論證java

  • 手中的牌是有序的,而且爲[0...i], 手中牌數量爲(i)
  • 剩餘的牌庫是無序的,而且爲[i+1...n], 剩餘牌數量(n - i - 1)

整個過程能夠歸納爲:算法

從剩餘牌庫中依次循環抽取牌,循環 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的一刻,認定排序了整個手中牌數組
相關文章
相關標籤/搜索