1. 程式人生 > 實用技巧 >演算法學習:希爾排序(插入排序)

演算法學習:希爾排序(插入排序)

1、插入排序有兩種,直接插入排序和希爾排序

2、希爾排序核心思想

希爾排序本質也是一種插入排序,但是是根據簡單插入排序進行優化有的一種更加高效的版本,別稱是縮小增量排序。 希爾排序的核心思想是將排序陣列按照增量進行分組,然後對分組的元素進行直接插入排序,迴圈縮小分組增量,最後當增量長度為1是排序結束。

3、舉例:給不同身高的人進行排序

第一步:分組,找一個間隔分組,間隔取4。間隔通常是總長度的一半,奇數偶數均可。

如圖所示:0,4,8一組;1,5一組,2,6一組;3,7一組。

第二步:對於每組元素,分別進行排序

  第一組:0,4,8 已經排好序;

  第二組:5,1

  第三組:6,2

  第四種:3,7

所有組拍完序後,此時:

第三步:繼續設定間隔,這次的間隔是上次的一半,間隔取2

  第一組:0,2,4,6,8

  第二組:1,3,5,7

第四步:重複步驟二給每組排序:

  第一組:2,0,6,4,8

  第二組:3,7,1,5

全部排完序後:

第五步:再次設定間隔,間隔取上次的一半1

當間隔為1時,使用插入排序法,進行排序

最終結果:

方法總結:對每個分組進行插入排序

4、程式碼

對陣列[83,29,30,5,99,34,12,66]使用希爾排序進行排序。

def shellsort(arr):
    #設定步長
    gap = len(arr)
    while gap > 0:
        #遍歷分組
        for i in range(gap,len(arr)):
            #對當前分組的元素進行插入排序
            for j in range(i,gap-1,-gap):
                if arr[j] < arr[j-gap]:
                    arr[j],arr[j-gap]=arr[j-gap],arr[j]
                else:
                    break
        print(arr)
        gap //= 2# 步長減半
    return arr

arr=[83,29,30,5,99,34,12,66]
print("最終結果:",shellsort(arr))

結果:

5、希爾排序的時間複雜度

希爾排序是按照不同步長對元素進行插入排序,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個素很少,速度很快; 當元素基本有序了,步長很小,插入排序對於有序的序列效率很高。 所以希爾排序的時間複雜度比O(n^2)要好一些。