算法基础-使用循环不变式解决插入排序问题

  思想是直接插入排序,即每次拿一个数字向已排序好的数字中插入,采用循环不变式的设计思想。

  循环不变式:一般而言,用这个式子表示希望得到的结果,如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确,并得到了期望的结果。

 如何证明循环的每一步式子都是正确的?

 需要证明式子满足三个性质:

 初始化:循环的第一次迭代之前,它为真。

 保持:如果循环的某次迭代之前它为真,那么下次迭代仍然为真。

 终止:证明循环终止时,是期望结果。

代码:

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=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 终止;循环终止时候,得到的是原数组排序好的数组,符合期望。

你可能感兴趣的:(算法)