循环不变式,百度的解释:一般而言,用这个式子表示希望得到的结果,如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确,并得到了期望的结果。这就算定义了吧。
它的三个性质,初始化、保持和终止,基本意思就是,在循环的第一轮迭代开始前、循环中每一轮迭代开始前和循环结束时,这个式子或性质都是正确的。
拿插入排序算法来说吧,有数组A[1...n],包含了n个待排序的数,要求按由小到大顺序排列。用变量key来临时存储数组元素。
开始:在整个循环开始前,只取数组的第一个元素A[1]作为已经排好序的序列,不妨称之为“完成序列”。显然,此时的完成序列是满足“有序”这一性质的,只有一个元素嘛。也就是说,“初始化”这一点有保证了。
循环中:从第二个数组元素开始,执行排序算法。取出第二个元素,key=A[2],拿key跟A[2]之前的所有“有序”的元素作比较,找个适当的位置插入。这时完成序列只有A[1]一个元素,若此时key<A[1],则把A[1]放在A[2]的位置,把key的值放入A[1]的位置,否则不变。这就完成了前两个元素的排序。现在的完成序列包含了两个元素,并且满足“有序”这一性质,保证了在下一轮迭代前,完成序列的有序性。接下来开始第三轮循环,key=A[3],同第二步,拿key跟A[3]之前的所有“有序”的元素作比较,找个适当的位置插入。此轮插入结束后,完成序列包含三个已经排好序的序列,从而保证了第四轮迭代前的“有序”这一性质……直至整个循环结束。从分析中可以看出,循环不变式的第二个性质,“保持”这一点得到了保证。
最后:当整个循环结束时,完成序列已然是“有序”的,这个性质在每轮迭代后保持了下来。“终止”这一点得到了保证。
因此,插入排序算法满足循环不变式的思想。
感觉拿打牌的例子来理解插入排序和循环不变式更形象,“初始化”时左手中只有一张牌,显然是有序的;中途每揭一张牌插入已有的序列,都保证其有序性,即满足了“保持”的性质;最后所有的牌必然是有序的,所以满足“终止”的性质。
总结一下,就是循环不变式满足:如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确。