希尔排序

2022-06-29  本文已影响0人  小吉头

希尔排序思路

示例d=4排序演示:


为什么要分组

分组是为了防止出现插入排序中某个非常小的数插入时前面所有元素(从小到大)都要移动,比如示例中第二组元素1分组后只要移动很少的步数,加快了插入的速度
示例中,当d=1时,列表变成[4,0,5,1,7,2,8,3,9],此时插入的复杂度相对初始列表会低很多。

代码实现

#插入排序将1替换成d
def insert_sort_gap(li,d):#从d下标开始,可以对照上面的示例图,即从元素8开始
    n = len(li)
    for i in range(d,n):
        tmp = li[i]
        j = i - d
        while j >=0 and li[j] > tmp:
            li[j+d] = li[j]
            j -= d
        li[j + d] = tmp


li = [5,9,7,3,8,1,4,0,2]
d = len(li) // 2
while d > 0:
    insert_sort_gap(li,d)
    d = d // 2
print(li)
>>>[0, 1, 2, 3, 4, 5, 7, 8, 9]

时间复杂度

相比插入排序提升很大,但是比快速排序、归并排序、堆排序慢
具体的计算方式可以自行查阅

上一篇下一篇

猜你喜欢

热点阅读