-
{31, 41, 59, 26, 41, 58}
{31, 41, 59, 26, 41, 58}
{31, 41, 59, 26, 41, 58}
{26, 31, 41, 59, 41, 58}
{26, 31, 41, 41, 59, 58}
{26, 31, 41, 41, 58, 59}
for j = 2 to A.length
key = A[j]
i = j - 1
while i > 0 and A[i] < key
A[i + 1] = A[i]
i = i - 1
A[i] + 1 = key
- 伪码:
for i = 1 to A.length
if v == A[i]
return i
return NIL
证明正确性:
先证明循环的正确性,循环不变式为:在 for 循环的每次迭代开始的时候,子数组 A[1 … i - 1] 中不包含元素 v。
- Initialization:初始的时候 i - 1 等于 0,所以子数组不存在,自然不包含元素 v
- Maintenance:每次迭代开始前,子数组 A[1 … i - 1] 中不包含元素 v,如果 A[i] 的值等于 v,就会退出循环,所以迭代结束时 子数组 A[1 … i] 中不包含元素 v,下次迭代开始前 i 会自增,从而循环不变量保持不变。
- Termination:有两种可能导致循环结束:或者是找到了 v,或者是因为 i == A.length + 1。如果是前者,那么就达到了搜索的目的;如果是后者,那么说明数组 A[1…A.length],即整个数组中都没有 v,返回 NIL,依然是正确的。
- 正式表述问题:输入两个长度为 n 的数组 A 和数组 B(下标从 1 到 n),数组中的元素是 0 或 1,数组 A 和数组 B 分别表示一个二进制数(下标 1 的元素表示最低位)。要求返回长度为 n+1 的数组 C,以同样的格式表示一个二进制数,且其大小等于 A 与 B 之和。
伪码:
int C[n + 1] = {0}, carry = 0
for i = 1 to n
C[i] = (A[i] + B[i] + carry) % 2
carry = (A[i] + B[i] + carry) / 2
C[n + 1] = carry
return C