《算法导论》 练习 2.1
一个好久没动脑的感觉人快坏掉了的超菜的文科生的《算法导论(第3版)》学习记录。
2.1 - 1
问:
说明 INSERTION-SORT 在数组 A = <31, 41, 59, 26, 41, 58> 上的执行过程。
答:
插入排序的过程,根据书中提供的伪代码可以得到,略。
2.1 - 2
问:
重写 INSERTION-SORT 过程,使之按非升序排序。
答:
伪代码如下
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
2.1 - 3
问:
考虑以下查找问题,
输入,n 个数的一个序列 A = <a1, a2, … , an> 和一个值 v;
输出,下标 i 使得 v = A[i] 或者当 v 不在 A 中出现时,v 为特殊值 NIL;
写出线性查找的伪代码,使用一个循环不变式来证明算法是正确的。
答:
伪代码如下
for i = 1 to A.length
if v == A[i]
return i
return NIL
循环不等式,在 1~3 行 for 循环的每次迭代开始时,子数组 A[1, …, i-1] 由原数组在 [1, i-1] 的元素组成,且其中不存在 v = A[j];
初始化,v 同 [] 中的元素不一样;
保持,若到下一次迭代,说明 v != A[i],又 v != A[1, …, i-1],说明 i 时的循环不等式成立;
终止,A[1, …, A.length] 说明不存在 v = A[j]。
2.1 - 4
问:
考虑把两个 n 位二进制整数加起来的问题,分别存储在 n 元数组 A 和 B 中,求其和 C。
答:
假定 A、B 是倒着存储的二进制整数数组,则伪代码如下:
for i = 1 to n
C[i] = A[i] + B[i]
C[i+1] = C[i] // 2
C[i] = C[i] % 2
C[n+1] = C[n] // 2