我目前正在阅读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。我很感激帮助。
答案 0 :(得分:1)
免责声明:这可能完全不正确......这只是一个大脑唾液。
旁注:由于j
在此循环期间递增,因此起点与结束条件无关。
for j = 2 to A.length //A.length = n in your question
这个伪代码有点含糊不清。
首先,我们假设 请参阅@ Dukeling的评论 j
在此for
循环之外定义,并且在循环终止时将具有结束值。
其次,您的代码使用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.