插入排序与循环不变式

首先,给出本文要使用的例子,对一个数组a进行升序的插入排序
算法的C语言描述
  1. void inserSort(int a[], int length)  
  2. {  
  3.         int i = 1;  
  4.         for(i = 1; i < length; i++)  
  5.         {     
  6.                 int key = a[i];  
  7.                 int j = i-1;  
  8.                 for (j = i-1; j>=0 && a[j]>key; j--)  
  9.                 {     
  10.                         a[j+1] = a[j];  
  11.                 }      
  12.                 a[j+1] = key;  
  13.       
  14.         }     
  15. }<strong>  
  16. </strong>  

什么是循环不变式

循环不变式是用于检验算法的正确性的。
在算法中,有一些特定的性质(也是我们我们实现这个算法最关注的性质),它在循环迭代中是稳定不变的。
如插入排序算法中,有循环不变式:当我们要第i个元素前,a[0,...,i-1]是有序的。
循环不变式有三个性质:
初始化: 第一次迭代前,循环不变式为真。如前面的代码中,i=1时,循环不变式为真(因为i前面a[0]一个元素,可以视为有序)
保持:     第n次迭代之前,为真,那么在第n+1次迭代之前也一定为真。在插入a[i]时,a[i]只是找寻特定的位置插入,没有破坏原来的不变式,
且a[i]插入后, 在下一次迭代之前(此时i已经自加),a[0,...,i-1]仍然有序。   类似数学归纳。
终止: 循环终止时,我们会得到一个有用的性质,该性质有助于验证算法正确性。(循环不变式的终止时循环不变式里最重要的一节),实际上,我们在循环终止时,也没有破坏循环不变式的稳定性。
原文地址:https://www.cnblogs.com/Windeal/p/4284641.html