Python3實現希爾排序

2021-09-21 13:06:01 字數 2456 閱讀 9908

小結專案位址

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序的實質就是分組插入排序。

該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

思想的理解可以參考維基百科的這篇文章希爾排序和這篇通俗易懂、層層遞進優化的文章白話經典演算法系列之三 希爾排序的實現,本文主要是基於後一篇文章的思想進行了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...