算法导论中介绍的插入排序方法:
一、将一个待排序的数字分成两个子数组:
1、左边的子数组:
最开始只有一个元素A[1],而且该数组总是排好序的,总是拿走右边数组的第一个元素来插入到合适的位置排序。直到右边数组再无元素。A[1..j].
2、右边的子数组
是原始数组的排列顺序,总抽取第一个元素去左边数组插入。
二、INSERTION—SORT(A)算法
//先从桌子上的扑克牌中拿最上面一张在左手中(把整个数组的第一个元素分到左边数组)
for j=2 to A.length //拿起第二张牌
key=A[j] //
i=j-1 //选择左手中最右边的牌作为和刚从桌子上拿到的牌作为第一个比较对象
while i>=0 and A[i]>key //开始循环,不断的与左手上的牌比较,从右到左的顺序,遇到比key大的,右移一位
A[i+1]=A[i] //
i=i-1 //
A[i+1]=key //
三、python语言实现
a = [8,6,4,1,0,5,8,9,2]
for i in range(1,len(a)):
key=a[i]
j=i-1
while j>=0 and a[j]>key:
a[j+1]=a[j]
j=j-1
a[j+1]=key
print(a)
注:应该要j>=0
四、循环不变式
书中提到循环不变式,包括初始化,保持和终止。我的理解是指这个程序运行正常应该具备的环境或条件要符合要求。
五、练习
1、
31,41,59,26,41,58
31 41,59,26,41,58
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
。。。。。。。
2、降序算法
a = [8,6,4,1,0,5,8,9,2]
for i in range(1,len(a)):
key=a[i]
j=i-1
while j>=0 and a[j]<key:
a[j+1]=a[j]
j=j-1
a[j+1]=key
print(a)