插入排序与希尔排序

插入排序就好像我们打扑克牌的时候对扑克牌进行换序,前面的已经排好序了,后面的需要往前面排好序的队列中插入,但是程序无法直接插入到两个索引的中间,所以插入新的一张牌的时候,不断比较的同时,需要不断地将那些已经比较完成的元素向右移,以此给要插入的元素腾出空间。下面是我已经编号的一个程序,它的错误在于比较的同时没有及时的向右移,妄图找好位置后一步到位

def insertsort2(alist):
    for index in range(1,len(alist)):
        currentvalue=alist[index]
        pos=index
        while pos>0  and currentvalue<alist[pos-1]:
            pos=pos-1
        alist[pos],alist[index]=alist[index],alist[pos]
 alist=[1,4,2,5,3]
insertsort2(alist)

[1, 2, 3, 5, 4]

这种程对1,4,2,5,3排序就会造成上面的结果

def insertSort(alist):
    for index in range(1,len(alist)):
        currentvalue=alist[index]
        position=index
        while position>0 and alist[position-1]>currentvalue:
            alist[position]=alist[position-1]#这是一个不断将元素进行右移的过程,因为不断地将左面的值放在右面的位置
            position=position-1
        alist[position]=currentvalue

接下来介绍希尔排序,希尔排序是插入排序的一种变形,插入排序从第二个数开始,每一个数都跟前一个数进行比较,,如果发生逆序,就进行调换。但是这种排序方法对于大规模乱序数组排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从列表的一端移动到另一端。希尔排序的思想是使得数组中任意间隔为h的数组都是有序的。假设h为2,就是说只要保持第1,3,5,7,9个数或者第2,4,6,7,8个数是有序的就可以,我们经过这样的初步排序,再缩小h,将h缩小为1,则希尔排序就退化普通的插入排序。注意无论我们最先选择的h是多大,最后一定要缩小到h=1,否则的话就有可能产生诸如[1,4,3,9,5]这样的情况。至于它的代码,只要将插入排序中的1改成gap,在加上一个关于gap的循环即可。希尔排序并不能减小比较的次数,只不过他有可能减小移动的次数,从而加快排序速度。

def  shell_sort(alist):
    gap=len(alist)//2
    while gap>0:
        for index in range(gap,len(alist)):
            current_value=alist[index]
            position=index
            while position>0 and alist[position]<alist[position-gap]:
                alist[position],alist[position-gap]=alist[position-gap],alist[position]
                position-=gap
        gap=gap//2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值