希爾排序思想
有點類似歸併可以分為兩步:
(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...