一、课后习题
2.1-1 以图 2-2为模型,说明INSERTION-SORT 在数组 上的执行过程。
2.1-2 重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。
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个数的一个序列 和一个值v。
输出: 下标i使得v=A[i] 或者当v不在A中出现时,v为特殊值NIL。
写出线性查找的伪代码, 它扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。
LINEAR-SEARCH(A,v)
for i=1 to A.length
if A[i]==v:
return i
return NIL
循环不变式:
初始化:第一次循环迭代之前,未找到v,结果为NIL
保持: 第i次迭代时,若A[i]==v,则表示找到v,返回v在A中的下标i,若没有找到,则进入下一次迭代,相当于结果为NIL。
终止: 在整个循环中,i逐渐增加1,如果找到v,则返回下标,循环终止,若一直没有找到v,则当下标超过A的长度时,退出循环,返回NIL。
2.1-4 考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应该按二进制形式存储在一个(n+1) 元数组C中。请给出该问题的形式化描述,并写出伪代码。
形式化描述:
输入: 两个整数的n位二进制序列,分别为 和
输出: n+1个数的序列 ,且C为A和B的和
BINARY-SUM(A, B, n):
let C[1...n+1] be new array and initialised to 0
carry = 0
for i=n downto 1
if A[i]+B[i]+carry==2
C[i+1]=0
carry =1
else
C[i+1]=1
carry =0
if carry==1:
C[0] = 1
return C
2.2.-1 用记号表示函数
2.2-2 考虑排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法称为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n-1个元素,而不是对所有n个元素运行?用记号给出选择排序的最好情况与最坏情况运行时间。
1) 伪代码:
SELECTION-SORT(A):
for i=1 to A.length-1:
min_index = i
for j =i+1 to A.length:
if A[j]<A[i]:
min_index = j
A[i],A[min_index] = A[min_index],A[i]
return A
2) 循环不变式: 在for循环的每次迭代开始时,子数组A[1,...,i-1] 中已按照非递减顺序排好,且由A中的前i-1个最小值组成
3) 因为当前n-1个元素排好顺序时,根据循环不变式,前n-1个元素由A中的前n-1个最小值组成,即A[n]为最大值,因此不用排第n个元素
4) 最好情况,A已排好顺序,但是依然要遍历所有元素确认最小值,最坏情况为A完全逆序,每次遍历所有元素确认最小值,这两者都是