数据结构与算法(17)——谢尔排序

  • 谢尔排序

以插入排序作为基础,插入排序在最好 情况为O(n),这种情况发生在列表已经是有序的情况下,实际上,列表越接近有序表,插入排序的比对次数越少。

因此,谢尔排序则将插入排序分为固定间隔的很多子列表,每个子列表都进行插入排序。

 一般子列表的间隔从n/2开始。

谢尔排序的实质是带间隔的插入排序。

  •  代码
#谢尔排序是插入排序的一般情况
def shellsubSort(alist):
    sublistcount = len(alist)//2
    while sublistcount > 0:
        for startposition in range(sublistcount):
            gapInsertSort(alist, startposition, sublistcount)
        print('After increments of size',sublistcount,'The lit is', alist)
        sublistcount = sublistcount // 2 #间隔缩小
#插入排序
def gapInsertSort(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]
shellsubSort(alist)
print(alist)
  • 性能分析

谢尔排序相比插入排序可能并不会比其好,但由于没趟都使得列表更加接近有序,这个过程会减少很多原先需要的无效的比对。

谢尔排序的时间复杂度介于o(n)~o(n^2)之间。约为o(n^3/2)

posted @ 2020-07-23 15:37  Yelush  阅读(242)  评论(0编辑  收藏  举报