您的位置:首页 > 其它

《算法导论》学习笔记:2.1 插入排序

2018-02-18 21:12 337 查看
一、笔记
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
) #测试用:打印原数组
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
) #测试用:打印分组后数组三、练习题
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
)
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
)
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)证明
初始化:
保持:
终止:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法