一下答案为本人总结,如有错误或更好的解法,欢迎指出!
2-1-1:
根据图2-2,叙述题目中数组A=<31,41,59,26,41,58>的执行过程。
循环开始前,将数组A的第一个元素固定,由于仅包含一个元素,说明A[0]这个序列是已经排好序的序列;循环开始,每次循环时,A[1]设定为key值,与A[1]左边的序列依次进行对比分析,如果key值小于右边序列的值,调换位置,A中,41>31,不用调换,循环这一过程,直到数组循环完毕。
具体流程如下:
31 41 59 26 41 58
31 41 59 26 41 58
31 41 26 59 41 58
31 26 41 59 41 58
26 31 41 59 41 58
26 31 41 41 59 58
26 31 41 41 58 59
2-1-2:
a=[5,2,4,6,1,3] for j in range(1,len(a)): 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 print(a)
2-1-3:
伪代码:
Linear_Find(A,v):
n=len(A)
for i in range(n):
if v==A[i]:
return i
return NIL
循环不变性的描述证明:
初始化:在循环迭代之前,正确---因为数组没有进行任何操作,也没有返回任何数值
保持:在第K次循环的情况下,存在两种可能的情况,匹配到V,返回该元素所在下标;未匹配到V,继续进行下一步的循环,操作正确
终止:循环终止时,存在两种情况,匹配到V,返回该元素所在下标;未匹配到V,返回值NIL,算法正确
2-1-4
形式化描述:依次对两个二进制的每一位进行加操作,C[i+1]=A[i]+B[i]+flags,如果C[i+1]为零,那么相应的加和后的新二进制数的相应位也为零,同时设定flag=0;如果C[i+1]为1,相应位的二进制位也为1,flag=1;如果C[i+1]等于2的情况下,相应位的二进制位为0,flag=1;如果C[i+1]等于3的情况下,相应的二进制位为1,flag=1
伪代码:
ADD_B(A,B):
n=len(A)
C=[0 for i in range(n+1)]
flag=0
for i in range(len(A)-1,-1,-1):
c=A[i]+B[i]+flag
if c==0:
C[i+1]=0
flag=0
elif c==1:
C[i+1]=1
flag=0
elif c==2:
C[i+1]=0
flag=1
elif c==3:
C[i+1]=1
flag=1
C[0]=flag