數據結構筆記:希爾排序

原文地址

分類目錄——數據結構筆記

  • 理論

每隔一個gap取一個值構成一個子序列,比如一個含9個值的序列,gap=4,這就獲得了四個序列(i1, i5, i9), (i2, i6), (i3, i7), (i4, i8),這種分子序列是在邏輯上進行的,並不改變原序列的結構

在每個子序列內進行插入排序

shellsort

排序完一輪後將gap減半,再次進行按gap分子序列插入排序

gap選取是一個值的研究的地方

  • 實現

    在描述原理時把整個序列分成若干子序列,每個子序列進行插入排序。

    在實現的時候,爲了實現方便,採用一種每個子序列批量插入排序的方式(有些串行的感覺),而不是一個子序列排序完成後再排序下一個子序列,大概是這樣的,操作完第一個序列中的第二個元素,再操作第2個序列的第2個元素,再第3個的第2個元素,,,

    def shellsort(alist):
        n = len(alist)
        gap = n//2  # 5/2=2.5   5//2=2  取整
    
        while gap >= 1:
            # 這樣同時執行幾個子序列排序的方式就比較好寫,可以直接寫成rang(gap,n)
            # 內部就跟插入排序是一樣的
            for i in range(gap, n):
                j = i
                while j>0:
                    if alist[j]<alist[j-gap]:
                        alist[j], alist[j-gap] = alist[j-gap], alist[j]
                        j -= gap
                    else:
                        break
            # 縮短gap
            gap //= 2
    
  • 測試

    if __name__ == '__main__':
        ll = [3,6,2,4,7,5,8,1,0,9]
        print(ll)
        shellsort(ll)
        print(ll)
    
  • 時間複雜度

    • 最優時間複雜度:根據步長序列的不同而不同
    • 最壞時間複雜度:O(n^2)
    • 穩定性:不穩定
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章