循环不变式

循环不变式

循环不变式其主要是用来帮助我们理解和证明算法的正确性。
关于循环不变式我们必须证明三个性质:

  • 初始化:它在循环的第一轮迭代开始之前,应该是正确的。
  • 保持:如果在某一次循环迭代开始之前是正确的,那么在下一次迭代开始之前,它也应该保持正确。
  • 结束:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。

插入排序的证明

for j = 2 to A.length
    key = A[j]
    // Insert A[j] into the sorted sequence A[1..j-1].
    i = j-1
    while i > 0 and A[i] > key
        A[i+1] = A[i]
        i = i -1
    A[i+1] = key
  • 初始化:在第一轮迭代开始之前,证明其正确性。此时j=2,A[1…j-1]中只有一个元素A[1],显然,一个元素是已经排序的了。所以,证明了循环不变式在第一轮迭代之前是成立的。
  • 保持:接下来要证明在每轮迭代中,循环不变式保持成立。迭代之前,假设A[1…j-1]是已经排好序的序列,待排序的元素A[j]依次与A[j-1]、A[j-2]进行比较,如果A[j-1]等大于A[j],则依次将其向右移动一位,当遇到开始小于A[j]的元素时,则A[j]找到了合适的插入位置,插入之后,整个序列又是排好序的了。即在假设j成立的情况下,j+1也成立,循环不变式在迭代过程中保持成立。
  • 终止:最后,分析一下循环结束时候的情况。当j=n+1时,循环结束,此时A[1…n]中已经有n个元素,且已经排好序,就是排好序的数组A[1…n],所以算法正确。

猜你喜欢

转载自blog.csdn.net/shujiaw/article/details/85168044