python實現希爾排序演算法

weixin_33843409發表於2019-04-18

希爾排序是插入排序的一種又稱“縮小增量排序”,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。

希爾排序的核心是對步長的理解,步長是進行相對比較的兩個元素之間的距離,隨著步長的減小,相對元素的大小會逐步區分出來並向兩端聚攏,當步長為1的時候,就完成最後一次比較,那麼序列順序就出來了。

2019-04-18-23_53_09.png

如上面例項:第一次排序步長為5,那麼需要比較的元素對為:9-4 1-8 2-6 5-3 7-5,只需要將這幾組元素比比較並交換位置;然後開始第二輪的比較。

def shell_sort(items):
    """
    希爾排序
    :param items: 
    :return: 
    """

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


不需要大量的輔助空間,和歸併排序一樣容易實現。希爾排序是基於插入排序的一種演算法,在此演算法基礎之上增加了一個新的特性,提高了效率。希爾排序沒有快速排序演算法快,因此中等大小規模資料排序中表現良好,對規模非常大的資料排序不是最優選擇。

希爾演算法在最壞的情況下和平均情況下執行效率相差不是很多,與此同時快速排序在最壞的情況下執行的效率會非常差,幾乎任何排序工作在開始時都可以用希爾排序,本質上講,希爾排序演算法是直接插入排序演算法的一種改進,減少了其複製的次數,速度要快很多。 

2019-04-18-23_53_09.png

相關文章