需要帮助证明循环不变性(简单的冒泡排序,部分正确性)

时间:2018-07-10 02:37:18

标签: arrays algorithm sorting loop-invariant proof-of-correctness

冒泡排序算法(伪代码):

Input: Array A[1...n]
for i <- n,...,2 do
    for j <- 2,...,i do
        if A[j - 1] >= A[j] then
            swap the values of A[j-1] and A[j];

我不确定,但我的证明似乎有用,但过于混乱。你能帮我清理吗?

  

循环不变式:每次迭代i之后,i-n + 1最大   A的元素处于将被排序的位置   非降序地。如果数组A包含多个   最大值,让最大的元素成为索引最小的元素   所有可能的最大值。

     

归纳法(i = n):内部循环遍历的每个元素   A.最终,j指向最大元素。该值将是   交换直到到达位置i = n,这是最高位置   在数组A中,因此是A中最大元素的最终位置。

     

归纳步骤:(对于所有m> 3,i = m-> i = m-1):内部循环   迭代A的每个元素。最终,j指向最大的   尚未排序的元素。该值将交换直到   它到达位置i = m-1,这是位置的最高位置   数组A中尚未排序的位置,因此的最终位置   A中尚未分类的最大元素。

     

算法完全执行后,其余元素位于   位置1也处于最终位置,因为不是   右侧的元素将不在其最终位置,即   矛盾。 Q.E.D。

1 个答案:

答案 0 :(得分:1)

我倾向于以以下方式重铸您的证明: Bubble sort A[1..n]: for i in n..2 for j in 2..i swap A[j - 1], A[j] if they are not already in order

循环不变式: 令P(i)<=>对于所有k s.t. i

基本情况: 最初,i = n,并且满足不变量P(n)。

归纳步骤: 假设对于某些P(m + 1)成立, 表明在执行内循环之后,不变量保持P(m)。