思想是直接插入排序,即每次拿一个数字向已排序好的数字中插入,采用循环不变式的设计思想。
循环不变式:一般而言,用这个式子表示希望得到的结果,如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确,并得到了期望的结果。
如何证明循环的每一步式子都是正确的?
需要证明式子满足三个性质:
初始化:循环的第一次迭代之前,它为真。
保持:如果循环的某次迭代之前它为真,那么下次迭代仍然为真。
终止:证明循环终止时,是期望结果。
代码:
package com.zjq.arithmetic.sort;
public class Insert_Sort {
public static void main(String[] args) {
int[] eg={3,2,4,5,1,6};
Insert_Sort insert_Sort=new Insert_Sort();
eg=eg=insert_Sort.insertSort(eg);
for(int m=0;m<eg.length;m++){
System.out.println(eg[m]);
}
}
/**循环不变式
* @param array
* @return
*/
public int[] insertSort(int[] array){
for(int i=1;i<array.length;i++){
int k=array[i];
int j=i-1;
while(j>=0&&array[j]>k){
array[j+1]=array[j];
j=j-1;
}
array[j+1]=k;
}
return array;
}
}
只要循环之前array[i-1](下标是原数组的0至i-1)是排序好的数组,那么下次循环得到array[i](下标是原数组的0至i)仍然是排序好的数组,并且循环结束时得到的是整个排序好的数组。
此代码满足循环不变的三个性质。
1 初始化:循环下标从1开始,初始时候下标0,数组只有一个数array[0],当然是排序好的。
2 保持:每次循环是将新的数字插入到上一次排序好的数组中,得到让然是排序好的数组。
3 终止;循环终止时候,得到的是原数组排序好的数组,符合期望。