2.1-1 以图2-2为模型,说明INSERTION-SORT在数组A={31,41,59,26,41,58}上的执行过程。
31
31 41
31 41 59
26 31 41 59
26 31 41 58 59
2.1-2重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序。
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。
写出线性查找的伪代码,它扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。
循环不变式主要用来帮助我们理解算法的正确性。关于循环不变式,我们必须证明三条性质:
初始化:循环的第一次迭代之前,它为真。
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。
for(int i=0;i<A.length;i++)
{
if(A[i]==v)
{
return i;
}
else
{
v=NIL;
return null;
}
}
2.1-4 考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个整数的和应按二进制形式存储在一个(n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。
对A[i]位和B[i]位相加,如果得2向前进一位(flag=1),C[i]=0。如果得1,C[i]=1+flag,flag=0。如果得0,C[i]=0+flag,flag=0。
flag=0;
for(int i==0;i<n;i++)
{
if(A[i]==1&&B[i]==1)
{
C[i]=flag;
flag=1;
}
else if(A[i]==0&&B[i]==0)
{
C[i]=flag;
flag=0;
}
else
{
if(flag)
{
C[i]=0
flag=1
}
else
{
C[i]=1
flag=0
}
}
}