循环不变量

本文通过定义循环不变量并验证其在循环初始状态、进行时及终结后的正确性,详细解析了插入排序算法的外循环正确性。以具体步骤展示如何确保每次迭代后子数组A[1...j-1]保持有序。

要证明循环正确,必须在以下三个环节中,考虑循环不变量的真假。

循环初始状态:在所有循环体执行前,循环不变量成立。

循环进行时:如果在一个循环体开始执行之前,不变量成立,那么在下一个循环体执行之前,不变量仍然成立。

循环终结后:当整个循环结束时,不变量可以直接说明算法的正确性。


以Insert sort为例,要证明其外循环的正确性。

复制代码

INSERTION-SORT(A)
1  for j ← 2 to length[A]
2       do key ← A[j]
3          ▹ Insert A[j] into the sorted sequence A[1 ‥ j - 1].
4          i ← j - 1
5          while i > 0 and A[i] > key
6              do A[i + 1] ← A[i]
7                 i ← i - 1
8          A[i + 1] ← key
复制代码

 

首先,用语言来描述本例的“循环不变量”——循环变量为j但循环未执行前,即A[1....j-1]来自输入且有序。

初始状态: j为2时,A[1...j-1] 就是 A[1],明显来自输入且有序,不变量成立。

进行时:我们来判断,每一步循环体执行后,A[1...j-1]是否仍然有序。 假设循环变量为j时成立,则在循环变量为j+1时,A[1...j-1]来自输入且有序,添加的A[j+1]数据来自输入,且插入后整个数组呈有序状态,因此,每轮循环体执行后,不变量保持成立。

循环结束后:j此时为n+1, A[1....j-1]为A[1....n],即整个数组,根据以上两条,不变量至此仍然是成立的,即整个数组为有序状态,达到算法预期的目的,可以判断循环正确!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值