数据结构:希尔排序python

思路:[256,35,96,2,34,65,732,653,20]

   对于一个数组,我们不再像插入排序那个把它当成两个部分,

而是引入一个gap,假设gap=4,就会有

  256                 34                      20

    35                  65 

     96                    732

       2                       653

分成了上面所示的4个子序列

 对于这些子序列进行插入排序,即   

  20                  34                          256

             35                     65

     96                       732

       2                            653

这时候数组就为[20,35,96,2,34,65,732,653,256]

我们将gap减少,让gap=3

20             2             732

 35             34             653

        96               65                  256

再分别进行插入排序

2                  20                     732

    34                 35                       653

   65                   96                          256

数组就为[2,34,65,20,35,96,732,653,256]

按照上述做法值到gap=1,这时候就是插入排序

我们先写出内部比较部分:这时候我们考虑最后一个元素它的第一次排序情况:

#codin: utf-8

def shell_sort(alist):
    n=len(alist)
    gap=4
    i=n-1
    if alist[i]<alist[i-gap]:
        alist[i],alist[i-gap]=alist[i-gap],alist[i]
        
        
a=[256,35,96,2,34,65,732,653,20]
print(a)
shell_sort(a)
print(a)

  结果:

 

 接下来我们整体考虑,上面这个判断情况应该是当i>0进可以继续进行下去,所以给它接上一个while循环

之后,我们将进一步考虑i的取值问题,我们发现i在跟i-gap位置上的元素进行比较,可以想到i<gap的时候,没办法比较,所以i应该选择从gap位置开始,不断添加,一直到最后一个元素位置为止

所以引入一个for循环,range(gap,n),其中有i=gap

这时候我们进完成了不断插入排序的过程

再考虑什么时候结束循环,由上面思路可知,gap最后应该为1,变成插入排序,所以再整体引入循环while gap>0

gap的取值问题:我们可以让它不断除以2,缩小范围,来控制整体循环次数,代码如下:

#codin: utf-8

def shell_sort(alist):
    n=len(alist)
    gap=n//2
    while gap>0:
        for j in range(gap,n):
            i=j
            while i>0:
                if alist[i]<alist[i-gap]:
                    alist[i],alist[i-gap]=alist[i-gap],alist[i]
                    i=i-1
                else: 
                    break
        gap//=2
        
a=[256,35,96,2,34,65,732,653,20]
print(a)
shell_sort(a)
print(a)

  结果:

 

posted @ 2020-05-17 10:20  Roronoa-Zoro  阅读(158)  评论(0编辑  收藏  举报