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

来源:互联网 发布:mysql trigger 判断 编辑:程序博客网 时间:2024/06/07 05:38

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

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

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

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

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

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

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

代码:

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

原创粉丝点击