希尔排序过程详解及代码实现

希尔排序:

算法思想:先将待排序列表分割成若干个形如L[i,i+d,i+2d,...i+kd] 的特殊子表,分别进行直接插入排序,当整个表中元素已呈"基本有序"时,再对全体记录进行一次直接插入排序。

希尔排序过程(王道数据结构):

先取一个小于n的步长d1,把表中全部元素怒分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组中进行直接插入排序;然后取第二个步长d2<d1,重复上述过程,直到所取到的d=1,即所有元素已放在同一组中,再进行直接进行插入排序。


def shell_sort(alist):
    n=len(alist)
    gap=n//2 #开始的间距设为表长除以2
    while gap>=1:
        for j in range(gap,n):
          i=j
          while(i-gap>=0):
            if alist[i]<alist[i-gap]:
                alist[i],alist[i-gap]=alist[i-gap],alist[i]
                i-=gap
            else:
                break
        # 缩短gap
        gap//=2
if __name__ == '__main__':
    list=[12,3,5,15,67,35,22,69,78]
    print("原始序列为:%s"%list)
    shell_sort(list)
    print("排序后的序列为:%s"%list)

时间复杂度:由于希尔排序的时间复杂度依赖增量序列的函数,这涉及数学上尚未解决的难题,所以其时间复杂度分析较为困难,当n在某个特定范围时,希尔排序时间复杂度约为O(n^1.3),最坏情况下为O(n^2).

空间复杂度:仅使用了常数个辅助单元,时间复杂度为O(1).

稳定性:不稳定,当相同关键字被划分到不同子表时,可能会改变它们之间的相对次序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值