希爾排序(shell sort)是改進後的插入排序,不同的是其設定乙個步長,將輸入按步長分組,對每組元素進行插入排序。然後減少步長,再次分組插入排序。直到步長變為1,也即對所有元素進行插入排序。
一般來說,習慣於將初始步長設定為 n/2, 然後每次減半,直至為1。乙個步長對應一趟分組排序。
找到乙個特別好的圖說明一下,出處為
鄙人不才,用python實現了乙個版本,**如下:
def初學者可能就有很多疑問:shell_sort(a):
if(len(a)<=1): #
處理邊界情況
return
gap = len(a)/2 #
初始化步長
while(gap>0):
for i in xrange(0, gap): #
進行gap次排序
start = i +gap
while(start#
對一組元素進行插入排序
flag =a[start]
insert_index =start
while(insert_index-gap>=0 and a[insert_index-gap]>flag):
a[insert_index] = a[insert_index-gap]
insert_index -=gap
a[insert_index] =flag
start +=gap
gap /= 2 #
減少步長
回答第乙個問題,雖然插入排序的次數變多了,但時間複雜度降低了。正常情況時間複雜度為o(n1~2),即使在現在,數學上也很難證明希爾排序的時間複雜度。有人用大量實驗資料作統計,在排序陣列足夠大的情況下,時間複雜度約為o(n1.3)。直觀上可以這麼理解,每次分組排序使得組內的數字有序,進而整體的有序性增加。使得下次減少步長再作排序所花費的時間變少。最終這個累加使得整體的時間複雜度降低。
第二個問題,其實這個問題我也沒有搞清楚,畢竟希爾排序的時間複雜度尚且無法求解,換句話說還無法給出嚴謹的數學解釋。換個排序辦法行不行?肯定行,但時間複雜度至少沒有插入排序的好。氣泡排序同選擇排序,穩定在o(n2)的時間複雜度,先否定。至於為什麼不是其他排序方法,如果有大神看到這個問題,求解釋!
時間複雜度o(n1~2);
未用到額外空間,空間複雜度o(n);
毫無疑問,分組排序的過程中,組內排序使得組之間元素的相對位置發生了改變,為不穩定排序演算法。
排序 2 希爾排序
我們來談一談希爾排序 希爾排序和直接插入排序一樣屬於插入排序,但是由於分組的存在,相等的元素可能分在不同組,導致他們的次序可能發生變化,所以它是不穩定的排序。除此之外由於它移動次數較少所以它比直接插入排序時間效能優越,效率更高。時間複雜度 最好情況 o n 最壞情況 o n2 平均情況 o n1.3...
排序2 希爾排序
shell排序本質也是一種插入排序,是先分組然後採用直接插入排序。因此也稱為縮小增量排序 2.1直接插入排序與希爾排序對比 前者時間複雜度o n 2 則100個資料需要10000次迴圈 後者若分為10組 100個資料分為10組,每組先有序 10 2 乘 10 1000次,再插入排序,而插入排序越有序...
2 希爾排序
是對插入排序的改進,也叫作縮減增量排序。屬於原址排序。1 思路 先取乙個小於n 陣列長度 的整數d1作為第乙個增量,把檔案的全部記錄分成 n d1 個組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序 然後,取第二個增量d2 2 複雜度分析 2.1 時間複雜度 o o 1 3 ...