INSERTION-SORT(A)
for j = 2 to A.length
key = A[j]
//Insert A[j] into the sorted sequence A[i...j-1]
i = j - 1
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i - 1
A[i+1] = key
对数组A进行从小到大插入排序
从数组的第二位开始(这本书的伪代码数组下标从1开始),将其赋值给key
依次与在它前面
的元素进行比较,直到i=0
或者遇到比它小
的数停下,开始比较后一位
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i - 1
上述代码的作用是将比key
大的数依次往后挪一位,使A[j]
可以放到在它前面所有比它大的数的前面。
下面的都是我自己写的不是标准答案!!!
1.说明INSERTION-SORT 在数组 A = <31,41,59,26,41,58>上的执行过程
<31,41,59,26,41,58> 从第二位(j=2)(也就是左边的41)往前比较,没有比它大的不移动位置
<31,41,59,26,41,58>到第三位(59),也没有比它大的,不移动位置
<26,31,41,59,41,58>第四位(26),前面全部都比它大,移到最前面
<26,31,41,41,59,58>到第五位(右边41),移动到59前面
<26,31,41,41,58,59>第六位,移动到59前面
结束
2.重写过程INSERTION-SORT,使之按非升序(而不是非降序)排序
插入排序顺序的关键就是
while i > 0 and A[i] >
key
只要将它改为<
就可以让它变成非升序,其他部分不变
3.考虑以下查找问题:
输入:n个数的一个序列A=< >和一个值v。
输出:下标i使得v=A[i]或者当v不在A中出现时,v为特殊值NIL。
写出线性查找的伪代码,它扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。确保你的循环不变式满足三条必要的性质。
fun(A,v)
for i = 1 to A.length
if A[i] == v
return i
return NIL
循环不变式:A[1…j]代表的是查找过的元素子数组
初始化:循环第一次迭代之前它为真
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它也为真
终止:在循环终止时
4.考虑把两个n位二进制整数加起来的问题,这两个整数分别存储在两个n元数组A和B中。这两个n位二进制整数的和应按二进制形式存储在一个(n+1)元数组C中。请给出该问题的形式化描述,并写出伪代码。
求二进制A+B的和,存放进C中
a=b=c=1
while a<n||b<n
if A[a]==1&&B[b]==1
k=c+1
else if A[a]==1||B[b]==1
k=c
while C[k]==1
C[k]=0
k=k+1
C[k]=1
a=b=c=c+1
return C