希爾排序過程:
希爾排序的基本思想是:將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列(步長更長了,列數更少了)來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。
def shell_sort(alist):
"""希爾排序"""
n = len(alist)
# 初始步長
gap = n // 2
while gap > 0:
# 按步長進行插入排序 # 插入排序演算法 從gap處開始
for j in range(gap, n):
# 處理元素向前遍歷插入到相應的位置上
i = j
# 插入排序
while (i - gap) >= 0: # 另一組的下標索引
if alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i -= gap
else:
break
# 得到新的步長 縮短gap間隔
gap //= 2
# gap = gap // 2
if __name__ == '__main__':
li = [54, 26, 77, 17, 77, 31, 44, 55, 20]
print(li)
shell_sort(li)
print(li)
時間複雜度
最優時間複雜度:根據步長序列的不同而不同
最壞時間複雜度:o(n2)
穩定性:不穩定
資料結構和演算法 排序演算法 希爾排序
希爾排序 希爾排序 希爾排序就是插入排序的一種改進版本,演算法的步驟 把乙個序列不視為乙個整體,而是視為多個子串行,假設間隔是gap 4 alist 54,26,93,17,77,31,44,55,20 54,26,93,17,77,31,44,55,20 54 77 20 這是1 組,間隔是4,2...
資料結構與演算法 希爾排序
希爾排序又稱縮小增量排序,實質上是分組直接插入排序。為了方便理解,先不討論如何獲得合適的增量陣列和整個演算法的 1 修改直接插入排序的 實現增量為gap的直接插入排序。將陣列從start到end中間隔為gap的子串行進行直接插入排序 private static void straightinser...
資料結構演算法之希爾排序
希爾排序的最大間隔是利用公式 h h 3 1 當前h設定為1 減小間隔公式 h h 1 3 h 4 while h 0 array 0 2 array 2,23,34,1,12,4,15,67,23 第二次 i 5 temp array 5 4 j 5 while j 3 array 1 4 arr...