演算法 希爾排序及其Python實現

2021-09-27 18:05:36 字數 1940 閱讀 2489

希爾排序思想

有點類似歸併可以分為兩步:

(1)拆分; (2) 排序。並且不斷重複這兩個步驟。

拆分:gap將資料拆成乙個個小的邏輯小組,並且gap不斷減少。一開始每個組最多只有2個元素,最後慢慢變成整體資料的一半,然後變成整體。而gap從一開始的int(len/2)最後變為2.

排序:對每個小組進行插入排序。

思路形象記憶:

其實就公升級版插入排序,插入排序適用於小規模或基本有序,希爾排序融入分治的思想,用乙個個小的插入排序去解決大規模、無序的問題。

**實現要注意的地方

考慮極端情況;

gap要記得int一下;

只要j小於gap,說明還可以向左走,所以j>=gap

只要arr[j-gap]>tmp,說明需要向左走;

不是排完乙個邏輯分組才去排另外乙個,而是同時的。每一組每組都優化乙個數;

特點:其實就是在插入排序上多乙個while迴圈判斷gap。三個迴圈都與gap有關。

while gap>0判斷gap是否需要繼續減半。

for i in range(gap, arr_len)相當於選中插入排序時,準備插隊的那個未排序數,而且這個i的特點是,輪流指向不同的邏輯分組,例如假設長度為8,gap=2時,此時有兩個邏輯分組,i會分別取2,3,4,5,6,7。當i=2,4,6時,其實是對第乙個邏輯分組進行插入排序(位置0即為第乙個邏輯分組中預設已排序的初始值);當i=3,5,7時,其實是對第乙個邏輯分組進行插入排序(位置1即為第二個邏輯分組中預設已排序的初始值)。

while j>=gap and arr[j-gap]>tmp就是插入排序。j的判斷值其實就是下面arr[j] = arr[j-gap]中後面的變數arr[j-gap]索引大於等於0的條件,即j-gap>=0,故j>=gap。(在插入排序中為j>=0,因為插入排序中賦值的時候是arr[j+1] = arr[j],其實本質是一樣的。插入排序**)

**

def

shell_sort

(arr)

:# 排序初始值

arr_len =

len(arr)

gap =

int(arr_len/2)

# 特殊情況考慮

if arr_len==0:

return

none

if arr_len==1:

return arr

# 只要增量未減為0,則繼續

while gap>0:

for i in

range

(gap, arr_len)

: tmp = arr[i]

j=i# 單組插入排序

# 只要j小於gap,說明還可以向左走

# 只要arr[j-gap]>tmp,說明需要向左走

while j>=gap and arr[j-gap]

>tmp:

# 比tmp大的值右移

arr[j]

= arr[j-gap]

# j減少增量值

j -= gap

# 若找到最佳位置,則插入

# 因為一旦j大於gap則說明已經是最左邊的數了,所以最佳位置就是j

arr[j]

= tmp

# 每個邏輯分組都排序後,gap減半

gap =

int(gap/2)

return arr

arr =[3

,2,1

,5,6

,5]shell_sort(arr)

print

(arr)

參考:希爾排序–簡單易懂**

Python排序演算法 希爾排序

希爾排序是插入排序的擴充套件,通過允許非相鄰的元素進行交換來提高執行效率。希爾排序最關鍵的是選擇步長,選用knuth在1969年提出的步長序列 1 4 13 40 121 364 1093 3280 後乙個元素是前乙個元素 3 1,非常方便選取 def shellsort seq length le...

Python 演算法 希爾排序

coding utf 8 希爾排序 defshell sort lst 希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法,時間複雜度為o nlogn 該方法因dl shell於1959年提出而得名。希爾排序是把...

希爾排序及其分析

希爾排序另一種叫法叫做縮減增量排序 演算法實現 public static void shellsort anytype a int j for int gap a.length 2 gap 0 gap 2 for int i gap ianytype tmp a i for j i j gap t...