希爾排序 原理及python實現

2021-09-27 04:11:58 字數 1507 閱讀 5247

# 希爾排序的實質就是分組插入排序,該方法又稱縮小增量排序,因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 子串行...