算法导论 华章第三版 习题
##练习题2.1-2
重写过程INSERTION-SORT,使之按非升序排序。
伪代码思路1:
for j=A.length-1 to 1
key=A[j]
i=j+1
while i<A.length+1 and A[i]>k
A[i-1]=A[i]
i=i+1
A[i-1]=key
所有排好序的序列都放在数组A的右边,从右到左遍历整个A,将其插入到右面有序的序列中
伪代码思路2:
所有排好序的序列仍然都放在数组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。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。
for i=1 to A.length
if A[i]==v
return i
return NIL
##练习题2.1-4
考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应按二进制形式存储在一个(n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。
for i=1 to n
val =A[i]+B[i]
if val==0
C[i]+=0
else if val==1
C[i]+=1
else if val==2
C[i]+=0
C[i+1]+=1
else if val==3
C[i]+=1
C[i+1]+=1
##练习题2.2-2
考虑排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A种的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法成为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n-1个元素,而不是对所有n个元素运行,用theta记号给出选择排序的最好情况与最坏情况运行时间。
min=+inv
for i=1 to n-1
for j=i to n-1
if A[j]<min
min=A[j]
j_min=j
exchange=A[i]
A[i]=A[j_min]
A[j_min]=exchange
theta(n方)???