插入排序算法 僞代碼
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();
}
}