希尔排序

原理

# 希尔排序(Shell Sort)是一种分组插入排序算法。

# 首先,取一个整数d1=n/2(n是列表长度),将元素分为d1个组,每组相邻元素之间距离为d1,在各组内进行直接插入排序;

# 然后,取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。

# 希尔排序每趟(每取一个整数分组称为一趟)并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。

动画演示


代码实现

插入排序回顾

def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i]
        j = i - 1
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp
    return li

希尔排序是分组的插入排序,每个组内的数据做插入排序。组内相邻元素的索引值间隔为gap,所以每个组内的插入排序算法可以直接将基本插入算法中的数字1换成gap,就得到希尔排序中每个组内元素的插入排序算法。

def insert_sort_gap(li, gap):
    for i in range(gap, len(li)):
        tmp = li[i]
        j = i - gap
        while j >= 0 and li[j] > tmp:
            li[j+1] = li[j]
            j -= gap
        li[j+gap] = tmp

希尔排序每个组内元素的插入排序是同时进行的。整体希尔排序算法如下

def shell_sort(li):
    d = len(li) // 2
    while d >= 1:
        insert_sort_gap(li, d)	
        d //= 2

希尔排序的时间复杂度比较复杂,并且每次分组的序列不同就会有不同的希尔排序。

我们现在使用的分组序列是将d依次减半组成的一组gap序列;希尔排序可以有不同的gap序列不同,且选取的gap序列不同,希尔排序的时间复杂度也是不同的。我们现在使用的这种gap序列的最坏时间复杂度是O(n^2),所以它比简单的插入排序的排序速度更快,但是比NB三人组的排序速度慢。

posted @ 2020-03-22 19:24  the3times  阅读(267)  评论(0编辑  收藏  举报