Python3&数据结构之希尔排序

希尔排序(Shell sort)

算法描述:

Step1:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序。

Step2:依次缩减增量再进行排序。

Step3:待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

算法结束。

因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序相较于前几种方法有较大的提升。

PS:学数据结构和算法最好的方法就是图解,能看懂图,就别看繁琐的文字描述,看不懂图,再结合文字描述看懂,算法也就学会了

#shellsort
def shellsort(arr):

    step = len(arr) // 2
    while step > 0:
        for i in range(step,len(arr)):
            while i >= step and arr[i - step] > arr[i]:
                arr[i] ,arr[i - step] = arr[i - step] ,arr[i]
                i -= step
        step //= 2
    return arr

if __name__ == '__main__':
    test = [49, 38, 65, 97, 76, 13, 27, 49]
    print(shellsort(test))

注:这种写法插入排序时使用了交换法

希尔算法的关键就是掌握缩小增量序列,即{n//2,(n//2)//2...1}(希尔增量),其平均时间复杂度为O(nlogn),最坏时间复杂度依然为O(n^2),一些经过优化的增量序列如Hibbard经过复杂证明可使得最坏时间复杂度为O(n^1.5)。

稳定性:不稳定

参考文献:

[1] http://www.cnblogs.com/chengxiao/p/6104371.html

[2] https://jingyan.baidu.com/album/db55b609f856604ba30a2f18.html?picindex=1

猜你喜欢

转载自blog.csdn.net/qq_38575545/article/details/84845659
今日推荐