为什么插入排序算法的终止循环不变量中j = n + 1?

时间:2017-11-07 22:43:40

标签: algorithm insertion-sort loop-invariant

我目前正在阅读TCRC算法导论第3版教科书的第2章,我正在阅读作者对该算法的循环不变量的解释。我理解作者的初始化和维护逻辑。然而,终止是我陷入困境的原因。作者声称在终止时,j = n + 1.但是,在算法的伪代码中,j从2循环到n。所以不应该j = n - 1?

编辑:本书的插入排序伪代码是:

for j = 2 to A.length
    key = A[j]
    // Insert A[j] into 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 = n + 1。这是因为for循环从2变为n(包含),所以在j超过n之后,循环终止,因此在终止时j = n + 1。我很感激帮助。

1 个答案:

答案 0 :(得分:1)

免责声明:这可能完全不正确......这只是一个大脑唾液。

旁注:由于j在此循环期间递增,因此起点与结束条件无关。

 for j = 2 to A.length //A.length = n in your question

这个伪代码有点含糊不清。

首先,我们假设j在此for循环之外定义,并且在循环终止时将具有结束值。 请参阅@ Dukeling的评论

其次,您的代码使用j作为索引器来定位数组:A[j]

to中的单词for j = 2 to A.length存在歧义,是否包含或排除A.length?并且有这个索引器A[j]

在一般情况下,对于A[j]中的索引器,j的有效范围为[0...A.length -1]

有些语言使用另一个范围,即:[1...A.length]我认为这是作者的意图,因为A[0]根本没有被击中。

如果是这种情况......并且for条件在它打破循环之前递增j(以测试条件并看到它是假的),那么......你将会得到j = A.length + 1

作为旁注:

在常见的C类语言中,数组的有效范围为[0...A.length -1]

在此C示例中,c在终止后的值为A.length

int c = 0;
for (c = 3; c < A.length; c++)
{

}
//c = A.length after the loop is completed.