循环不变式(loop invariant)

循环不变式是一种条件式(必须满足的条件,对循环而言是保持不变的,无论循环执行了多少次),循环语句没执行一次,就要求中间的结果必须符合不变式的要求。

  • (1)进入循环语句时,不变式必须成立;
  • (2)循环语句的循环体不能破坏不变式。也就是说,循环体开始循环时不变式成立,结束时也必须成立;
  • (3)如果循环语句终止时不变式,依旧成立,那么至少说明,循环在保持循环不变式上没有犯错。
// (**) 不变式在进入循环之前必须成立
while () {
    // 循环体开始
    ...
    // 循环体结束
    // (**) 不变式在此处也必须成立
}

1. 插入排序的循环不变式

插入排序由 N-1 趟(pass)排序组成。对于 P = 1 趟到 P = N-1 趟,插入排序保证从位置 0 到位置 P 上的元素为已排序状态(sorted)。

也即从位置 0 到位置 P-1 上的元素是已排序的。

typedef int ElementType;
void InsertionSort(ElementType* A, int N) {
    int j, P;
    ElementType Tmp;
    for (P = 1; P < N; ++P) {
        Tmp = A[P];

        // 应用循环不变式的地方
        // 因为前 0 ~ P-1 位置上所有的元素都是位于已排序的状态;
        // 所以当第一次出现 A[j-1] <= Tmp; 便找到了 Tmp 应该插入的位置
        for (j = P; j > 0 && A[j-1] > Tmp; --j) {
            A[j] = A[j-1];
        }

        A[j] = Tmp;
    }
}

转载于:https://www.cnblogs.com/mtcnn/p/9423552.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值