2.1 插入排序
2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A=<31, 41, 59, 26, 41, 58>上的执行过程。
思路:仔细研究插入排序代码即可,无需思路,注意A中先后存在两个41,在排序过程中及排序后这两个41的先后顺序仍然不变,即插入排序具有稳定性(概念见第8章)。
解:<31, 41, 59, 26, 41, 58>→<26, 31, 41, 59, 41, 58>→<26, 31, 41, 41, 59, 58>→<26, 31, 41, 41, 58, 59>
2.1-2 重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。
思路:此处将原代码第5行的A[i]>key的大于号改为小于号即可。
解:
INSERTION-SORT(A)
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。
写出线性查找的伪代码,它扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。
思路:顺序遍历数组即可。
解:
LINEAR-SEARCH(A, v)
flag = 0
if A.length == 0
return NIL
for j = 1 to A.length
if A[j] == v
flag = 1
return j
if flag == 0
return NIL
证明略。
2.1-4 考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应按二进制形式存储在一个(n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。
解:
(1)形式化描述:
输入:n个bool值的两个序列A=<a1, a2, … , an>,B=<b1, b2, … , bn>。
输出:(n+1)个bool值的一个序列C=<c1, c2, … , cn>。
(2)
思路:在每一位上,0+0=0,0+1=1+0=1,1+1=0并向前进位,因此C每一位的值等于A异或B并加上低一位的进位。
伪代码: