希尔排序

希尔排序

  1. 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;
  2. 然后取d2<d1,重复上述分组和排序操作;
  3. 直至di=1,即所有记录放进一个组中排序为止。

如下图,该列表有九个项。如果我们使用三的增量,有三个子列表,每个子列表可以通过插入排序进行排序。

完成这些排序后,我们得到如下图 所示的列表。虽然这个列表没有完全排序,但发生了很有趣的事情。 通过排序子列表,我们已将项目移动到更接近他们实际所属的位置。

接下来使用增量为 1 的插入排序; 换句话说,标准插入排序。注意,通过执行之前的子列表排序,我们减少了将列表置于其最终顺序所需的移位操作的总数。对于这种情况,我们只需要四次移位完成该过程。

希尔排序的实现

def shellSort(alist):
    sublistcount = len(alist)//2

    while sublistcount > 0:
    #一次将分段的起始元素开始输入到分段插入排序中
      for startposition in range(sublistcount):
        gapInsertionSort(alist,startposition,sublistcount)

      print("After increments of size",sublistcount,"The list is",alist)

      sublistcount = sublistcount // 2

#本质上实现的是插入排序
def gapInsertionSort(alist,start,gap):
    for i in range(start+gap,len(alist),gap):

        currentvalue = alist[i]
        position = i

        while position>=gap and alist[position-gap]>currentvalue:
            alist[position]=alist[position-gap]
            position = position-gap

        alist[position]=currentvalue

测试:

alist = [54,26,93,17,77,31,44,55,20]
shellSort(alist)
print(alist)

参考:

  1. 演示动画
posted @ 2019-01-05 19:21  youngliu91  阅读(105)  评论(0)    收藏  举报