希尔排序(数据结构)

0x01 介绍

​ 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

0x02 原理

​ 它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

​ 间隔由人选取,一般选 gap = len / 2,一轮排序后,间隔选取为 gap = gap / 2 。

0x03 时间复杂度

​ 希尔排序时间复杂度是 O( n 1.3 − 2 n^{1.3-2} n1.32),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O( n ( log ⁡ n ) n(\log n) n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O($n^2 $) 复杂度的算法快得多。

0x04 例子

题目:1,7,6,3,4,5,12,19,2

排序过程:

  • (1,4)、(7,5)、(6,12)、(3,19)间隔为 4 的插入排序
  • 1,5,6,3,4,7,12,19,2
  • (1,6,4,12,2)、(5,3,7,19)间隔为 2 的插入排序
  • 1,3,2,5,4,7,6,19,12
  • 1,2,3,4,5,6,7,12,19 间隔为1,直接插入排序

0x05 代码实现

def signal_shell_sort(a , d):
    if (d > len(a)):                #增量不能大于序列长度
        return -1
    i = d
    while (i < len(a)):             #设定直接循环上限
        temp = a[i]                 #存储当前元素
        if (a[i]<a[i -d]):          #假设当前元素比上一元素将前面元素后移
            j = i - d
            while( j > 0 and temp < a[j] ):         #插入到相应位置
                a[j+d] = a[j]
                j -= d
            a[j+d] = temp
        i +=1

def shell_sort(a ,d):
    while (d > 0 ):
        signal_shell_sort(a,d)
        d = d // 2


a = [1,9,3,46,75,21,6,74,31,13]
print(a)
shell_sort(a,3)
print(a)

0x06 参考

希尔排序 | 菜鸟教程 (runoob.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值