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

本文介绍了插入排序算法的实现及非升序排列的修改方式,并通过实例展示了排序过程。此外,还提供了一种线性查找算法的实现,并探讨了其正确性的证明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、笔记

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)证明

初始化:

保持:

终止:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值