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

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

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

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

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

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

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

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

代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值