• 插入排序与循环不变式


    首先,给出本文要使用的例子,对一个数组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]仍然有序。   类似数学归纳。
    终止: 循环终止时,我们会得到一个有用的性质,该性质有助于验证算法正确性。(循环不变式的终止时循环不变式里最重要的一节),实际上,我们在循环终止时,也没有破坏循环不变式的稳定性。
  • 相关阅读:
    C#事件和委托的区别
    已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10()随机1~10
    如何搭建github+hexo博客-转
    ngRouter和ui-router区别
    JS数组追加数组采用push.apply的坑(转)
    vue中关于computed的一点理解
    simplify the life ECMAScript 5(ES5)中bind方法简介
    github使用-知乎的某小姐的一篇文章
    Jade 模板引擎使用
    玩转Nodejs日志管理log4js(转)
  • 原文地址:https://www.cnblogs.com/Windeal/p/4284641.html
Copyright © 2020-2023  润新知