小結專案位址
希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序的實質就是分組插入排序。
該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
思想的理解可以參考維基百科的這篇文章希爾排序和這篇通俗易懂、層層遞進優化的文章白話經典演算法系列之三 希爾排序的實現,本文主要是基於後一篇文章的思想進行了python語言的實現。
步驟歸納:
選擇乙個步長序列tk,…,1。
按照步長序列個數k,對排序序列進行k趟排序,
每趟排序,根據對應的步長ti,將待排序序列分割成ti個子序列,分別對各個子串行進行直接插入排序
對直觀的理解希爾排序有幫助,但不夠簡潔清晰,可以在去掉一層迴圈
def
hell_sort
(collection)
: length =
len(collection)
gap = length //
2while gap >0:
for i in
range(0
, gap)
: j = i + gap
while j < length:
k = j - gap
temp = collection[j]
while k >=
0and collection[k]
> temp:
collection[k + gap]
= collection[k]
k -= gap
collection[k + gap]
= temp
j += gap
gap //=
2return collection
if __name__ ==
'__main__'
: collection =
list
(map
(int
,input()
.split())
)print
('排序前:'
, end='')
for i in collection:
print
(i, end=
' ')
collection = hell_sort(collection)
print
('\n排序後:'
, end='')
for i in collection:
print
(i, end=
' ')
def
hell_sort_optimization
(collection)
: length =
len(collection)
gap = length //
2while gap >0:
j = gap
while j < length:
k = j - gap
temp = collection[j]
while k >=
0and collection[k]
> temp:
collection[k + gap]
= collection[k]
k -= gap
collection[k + gap]
= temp
j +=
1 gap //=
2return collection
if __name__ ==
'__main__'
: collection =
list
(map
(int
,input()
.split())
)print
('排序前:'
, end='')
for i in collection:
print
(i, end=
' ')
collection = hell_sort_optimization(collection)
print
('\n排序後:'
, end='')
for i in collection:
print
(i, end=
' ')
後續實現的一些演算法我都會統一放到github,歡迎小夥伴們一起交流、學習,一起進步!下面是我的github**。
github data_structure_and_algorithm
Python3 資料結構之希爾排序
希爾排序 shell sort 演算法描述 step1 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序。step2 依次縮減增量再進行排序。step3 待整個序列中的元素基本有序 增量足夠小 時,再對全體元素進行一次直接插入排序。演算法結束。因為直接插入...
Python3 實現選擇排序
選擇排序 selection sort 原理很簡單,就是依次在未排序資料段中選擇出乙個最小的數,然後將其排列在已排序資料段末端,直到整個資料段排序完成演算法結束。程式如下,第乙個迴圈依次縮小未排序資料段的長度,並且每次將最小值暫定為未排序中第一位索引。第二個迴圈依次將該最小值與未排序資料段作比較,選...
堆排序python3實現
堆排序的思想 先將無序陣列調整為大頂堆 小頂堆,然後將堆頂元素r0和最後乙個孩子節點rn交換位置,此時r0 rn 1是無序的,rn是有序的,繼續迭代,將r0 rn 1調整為大頂堆 小頂堆,然後將堆頂元素r0和rn 1交換位置,迭代到堆中只剩下乙個元素為止 def heapfiy nums,n,i l...