# 希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因dl.shell於2023年提出而得名。
# 希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。
# 希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
# 插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率
# 但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位
l = [1, 3, 2, 32, 5, 4]
def shell_sort(l):
step = len(l)/2
while step > 0:
for i in range(step,len(l)): #在索引為step到len(l)上,比較l[i]和l[i-step]的大小
while(i >= step and l[i] < l[i-step]): #這裡可以調整step從小到大或者從大到小排列
l[i],l[i-step] = l[i-step],l[i]
i -= step
step /= 2
print l
shell_sort(l)
#別人的希爾排序**
#引用**:
# def shellsort(nums):
# # 設定步長
# step = len(nums)/2
# while step > 0:
# for i in range(step, len(nums)):
# # 類似插入排序, 當前值與指定步長之前的值比較, 符合條件則交換位置
# while i >= step and nums[i-step] > nums[i]:
# nums[i], nums[i-step] = nums[i-step], nums[i]
# i -= step
# step = step/2
# return nums##
# if __name__ == '__main__':
# nums = [9,3,5,8,2,7,1]
# print shellsort(nums)
這個演算法不難理解,但在寫程式的時候還是遇到了小小的麻煩。主要體現在它的時間複雜讀為o(n ** 1.3 )好奇怪的時間複雜度。
所以,在一次排序中,l[i]和l[i-step]的比較,一直迴圈到本組的第乙個元素。
還需要注意一點是的索引是從step開始的。
時間複雜度最壞情況是o(n ** 2)
空間複雜度o(1)
並不是乙個穩定的排序演算法。
排序演算法 希爾排序原理及Java實現
希爾排序也成為 縮小增量排序 其基本原理是,現將待排序的陣列元素分成多個子串行,使得每個子串行的元素個數相對較少,然後對各個子串行分別進行直接插入排序,待整個待排序列 基本有序 後,最後在對所有元素進行一次直接插入排序。因此,我們要採用跳躍分割的策略 將相距某個 增量 的記錄組成乙個子串行,這樣才能...
希爾(shell)排序原理分析及Java實現
shell排序 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2 public class demo system.out.print n public static void main...
希爾排序 Python實現
基本思想 希爾排序 def shell insert sort a,dk n len a for k in range dk 間距取dk,一共可以組成dk個子序列 for i in range k dk,n,dk 第0,dk,2dk.為一組 temp a i 記錄待插入的元素值 j i dk 子串行...