《算法导论》插入排序

算法导论中介绍的插入排序方法:

一、将一个待排序的数字分成两个子数组:

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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值