算法導論1--插入排序

插入排序算法 僞代碼

a 須要排序的數組
for j=1 to a.length
    //insert a[j] to  a[0,1...j-1] {循環不變式}
    key=a[j]
    i =j-1
        while i>=0 and a[i]>key
            a[i+1]=a[i]
            i=i-1
      a[i+1]=key

    // 其中 a[0,1...j] 表示 a 的子數組
    // and or 具備短路功能
    // 變量沒有特殊聲明,都是局部變量
    // 數組下標 是從0開始

循環不變式和數學概括法

**循環不變式,輔助咱們理解算法的正確性**
循環不變式必需要知足3條性質:
1. 初始化:它在循環的第一輪迭代開始以前,應該是正確的。
2. 保持:若是在某一次循環迭代開始以前是正確的,那麼在下一次迭代開始以前,
它也應該保持正確(假設當循環變量等於k時符合,再看執行一遍循環體後是否還符合循環不變式)。
3. 結束:當循環結束時,不變式給了咱們一個有用的性質,它有助於代表算法是正確的

針對此題,其數學化表示爲:
1. 當 j=0時,A[0]已正確排序
2-1. 假設 j=k時,A[k]插入A[0,1,2,...k],能使子列正確排序
2-2. 當j=k+1時,驗證A[k+1]插入A[0,1,2,...,k,k+1]可否使子列正確排序
    key=a[k+1]
    i =k
        while i>=0 and a[i]>key
            a[i+1]=a[i]
            i=i-1
      a[i+1]=key
    這輪排序,確實能夠使排序成功
3. 當循環結束時,確實能使整個數組都正確排序

java 代碼

public class Test {

    public static void main(String[] args) {
        Test t = new Test();
        int[] a = new int[] { 1, 3, 5, 6, 7, 43, 2 };
        t.sort(a);
        t.out(a);
    }

    public void sort(int[] a) {

        if (a.length <= 1) {
            return;
        }
        for (int j = 1; j < a.length; j++) {

            int key = a[j];
            int i = j - 1;
            //反向掃描
            while (i >= 0 && a[i] < key) {
                a[i + 1] = a[i];
                i--;
            }
            a[i + 1] = key;
        }
    }
    public void out(int[] a) {
        for (int i : a) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
相關文章
相關標籤/搜索