標籤:舉例 技術分享 size 希爾排序 ram idt param images 集合
希爾排序 Shell Sort
介紹:
希爾排序(Shell Sort)也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。
該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率比直接插入排序有較大提高。
執行流程:
首先取一個整數d1=n/2,將元素分為d1個組,每組相鄰量元素之間距離為d1[一組內資料間隔是d1構成的分組],在各組內進行直接插入排序;
取第二個整數d2=d1/2,重複上述分組排序過程,直到di=1,即所有元素在同一組內進行直接插入排序。
通常每一次分組間隔都是上一次分組的一半,直到最後為1直接執行插入排序!
舉例:
我們來看下希爾排序的基本步驟,在此我們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用一個序列來表示,{n/2,(n/2)/2...1},稱為增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。此處我們做樣本使用希爾增量。
希爾排序動態展示:
演算法實現:
def shell_sort(li): """ 希爾演算法 分組插入演算法,逐漸有序 :param li: 無序列表 :return: 有序列表 """ gap = len(li) // 2 #初始分組間隔 while gap > 0: #組內排序 # 以0~(gap-1)位的數作為各自分組的第一個數 for i in range(gap, len(li)): #從gap位開始與自己組內資料比較 tmp = li[i] #擷取當前位置的值 j = i - gap #自己所在分組,間隔為gap的值 while j >= 0 and tmp < li[j]: #比較,如果當前值比前一個值小 li[j + gap] = li[j] #把大的值賦給當前位置 j -= gap #再去當前組內間隔為gap的值比較 li[j + gap] = tmp #否則的話就不變 #當前分組內值比較完成 gap = gap // 2 #間隔減半,組內再排序 return li
總結:
希爾排序每趟並不使某些元素有序,而是使整體資料越來越接近有序;最後一趟排序使得所有資料有序。
希爾排序是一種分組插入排序演算法。將原資料集合分割成若干個子序列,然後再對子序列分別進行直接插入排序,使子序列基本有序,最後再對全體記錄進行一次直接插入排序。
最關鍵的是跳躍和分割的策略,也就是我們要怎麼分割資料,間隔多大的問題。通常將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序後得到的結果是基本有序而不是局部有序。
希爾排序的時間複雜度為: O(1.3n)
演算法 希爾排序