dkethin

本博客仅为学习日志!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

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

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

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


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


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