【发布时间】:2020-02-11 01:55:10
【问题描述】:
我必须使用递归进行插入排序,并通过使用循环不变量来证明其正确性。我相信我的代码是正确的,并且它适用于不同的输入。但是,我不知道如何像我的书那样证明它的正确性。有人可以通过使用循环不变量来证明它是正确的吗?
通过使用以下类似于数学归纳的步骤,在书中证明了这些算法是正确的。如有需要,请参考enter link description here
1 - 找到算法中每个循环的循环不变量。循环不变量是在循环开始之前、任何后续迭代之后以及循环终止时为真的条件。
2 - 使用逻辑证明循环不变量在循环初始化之前为真,在后续循环运行中维护,并且在循环具有时为真终止。
//n - The index till which the array D is to be sorted.
public static void sort(int n, int [] D){
if(n == 0){
return;
}else {
sort(n-1, D);
}
int lastItem = D[n];
int j = n-1;
while (j >= 0 && lastItem < D[j]) {
D[j + 1] = D[j];
j--;
}
//Insert the lastItem at the correct position.
D[j+1] = lastItem;
}
}
PS - 我使用的书是 Thomas Cormen 的“算法简介”,即 CLRS 书。
【问题讨论】:
-
你可以先注意到这种递归形式相当于使用循环,然后证明基于循环的版本是正确的。
-
@kaya3 - 你能在这里回答吗?谢谢。
标签: algorithm