################## 希爾排序 #######################
#
"""希爾排序
希爾排序就是插入排序的一種改進版本,
演算法的步驟
把乙個序列不視為乙個整體,而是視為多個子串行,
假設間隔是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,
26 31 這是2 組,間隔是4,
93 44 這是3 組,間隔是4,
17 55 這是4 組,間隔是4,
然後對每一組進行插入演算法的排序,
[54 77 20],認為54是第乙個,然後後面的每乙個去和前面比較,進行插入,--------[20 54 77 ]
全部都排序完成之後,再次合併成為乙個序列,
然後變化間隔, 比如是gap = 2,再次進行插入演算法的排序,
進行之後還是再次合併成為乙個整體序列
再次調整gap,比如gap=1 ,然後再次排序,直到排序完成,
"""
################## 希爾排序 #######################
#
# 第一版:def shell_sort(alist):
n=len(alist)
gap = n //2
while gap > 0 :
# 這個最外層的迴圈是控制gap的,越來越小,
for j in range(gap,n):
i = j
while i>0:
if alist[i] < alist[i - gap]:
alist[i], alist[i - gap] = alist[i - gap], alist[i]
i -= gap
else:
break
# 縮短gap步長,
gap //=2
# 第二版:
def shell_sort2(alist):
n = len(alist)
# 初始步長
gap = n // 2
while gap > 0:
# 按步長進行插入排序
for i in range(gap, n):
j = i
# 插入排序
while j>=gap and alist[j-gap] > alist[j]:
alist[j-gap], alist[j] = alist[j], alist[j-gap]
j -= gap
# 得到新的步長
gap = gap / 2
if __name__ == '__main__':
alist = [54,26,93,17,77,31,44,55,20]
shell_sort(alist)
print(alist)
資料結構 演算法 希爾排序
希爾排序過程 希爾排序的基本思想是 將陣列列在乙個表中並對列分別進行插入排序,重複這過程,不過每次用更長的列 步長更長了,列數更少了 來進行。最後整個表就只有一列了。將陣列轉換至表是為了更好地理解這演算法,演算法本身還是使用陣列進行排序。def shell sort alist 希爾排序 n len...
資料結構 選擇排序演算法和希爾排序演算法詳解
選擇排序演算法是經典演算法之一,你可以想象你在打牌,每次拿到的一張牌就是待排序的一張,你需要每一次跟之前的牌進行比較,然後將這張牌插入到合適的位置。那麼選擇排序也是一樣,將整個陣列看成兩個部分,有序部分和無序部分。現在需要將無序部分的數字跟有序部分進行比較,插入到正確的位置 下列 是插入排序的內層迴...
資料結構和演算法(三)希爾排序
希爾排序是一種基於插入排序的排序演算法。對於大規模的亂序陣列,插入排序很慢,因為它只會交換相鄰的元素,因此元素只能一點一點從陣列的一端移動到另一端。希爾排序為了加快速度簡單的改進了插入排序,交換不相鄰的元素以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序 希爾排序的思想是使陣列中任意...