一、笔记
1.循环不变式(留待补充):
(1)初始化:循环的第一次迭代之前,该式为真。
(2)保持:每次循环时保持真。如果n=i为真,则n=i+1为真。
(3)终止:循环终止时我们可证明算法是正确的。
二、源码(Python):
1.插入排序(Python)
array = [4,6,34,56,23,232] #测试用:原数组
print('------排序前-------')
for n in range(6):
print(array[n]) #测试用:打印原数组
for j in range(1,6):
key = array[j]
i = j-1
while i >= 0 and array[i] > key:
array[i+1] = array[i]
i = i - 1
array[i+1] = key
print('------排序后-------')
for n in range(6):
print(array[n]) #测试用:打印分组后数组
三、练习题
1.用上述算法说明A={31,41,59,26,41,58}的执行过程。
【答】31->31,41->31,41,59->26,31,41,59->26,31,41,41,59->26,31,41,41,58,59
2.修改上述算法,改为非升序
【答】Python源码如下:
array = [31,41,59,26,41,58]#原数组
print('------排序前-------')
for n in range(6):
print(array[n])
for j in range(1,6):
key = array[j]
i = j - 1
while i >= 0 and array[i] < key:
array[i+1] = array[i]
i = i - 1
array[i+1] = key
print('------排序后-------')
for n in range(6):
print(array[n])
3.考虑以下查找问题:
输入:n个数的一个序列A=<a1,a2,...,an>和一个值v。
输出:下标i使得v=A[i]或者当v不在A中出现时,v为特殊值NIL。
写出线性查找的代码,扫描整个序列来查找v。使用一个循环不变式来证明你的算法是正确的。
【答】
(1)代码(Python):
array = [31,41,59,26,41,58] #测试用:原数组
v = 159
flag = False
for i in range(1,6):
if array[i] == v:
print(i)
flag = True
if flag == False:
v = 'NIL'
print(v)
(2)证明:
初始化:
保持:
终止: