希爾排序(shell』s method)又稱「縮小增量排序」(diminishing increment sort),屬於插入排序的一種,由d.l.shell在2023年提出。希爾排序是對直接插入排序的改進,因為直接插入排序一次只將資料移動乙個位置,如果資料離插入位置較遠時,就需要多次比較和移動,希爾排序是將資料分組再排序,這樣每組的元素少,比較和移動的次數也就少了,以此提公升排序效率。
題目描述
給出一組資料,根據由小到大順序輸出。
輸入要求:
輸入乙個整數n(資料長度)
輸入n個資料
輸出要求:
輸出由小到大排序後的資料
樣例輸入:
10樣例輸出:37 28 46 19 55 28 92 84 63 71
19 28 28 37 46 55 63 71 84 92基本思想
假設待排序的資料都存放在陣列r[n]中,先取乙個小於n的整數h1作為第乙個增量,所有距離為h1的資料構成乙個子串行,把序列分成若干子串行,對每個子串行進行直接插入排序;然後取下乙個增量h2重複上述過程,直到h=1,對新序列進行直接插入排序。
如對於乙個含有10個資料的序列,第一輪取h1=5,整個序列被分成,,,, 5個子序列,對這5個子序列進行直接插入排序,再合成乙個新的序列。
第二輪取h2=3,整個序列被分成,, 3個子序列,對這3個子序列進行直接插入排序,再合成乙個新的序列。
第三輪取h3=1,即整個序列只有 這1個子序列,對這個序列進行直接插入排序,最後的結果就是有序序列。
可以看到,第一輪裡只有1個子序列需要排序而且只需要比較和移動1次,第二輪裡有2個子序列需要排序,子串行1中的28』和71只需比較和移動1次,子串行3中的37也只比較和移動1次,最終第三輪直接插入排序時,一共有3次迴圈需要插入,每次插入需比較和移動的距離也都很少。
參考**(c語言)
#include
void
shell_sort
(int r,
int n)
;//希爾排序
intmain()
void
shell_sort
(int r,
int n)
r[k+h]
=t;}
//所有子串行排序完成,合成新序列,本輪結束
h=h/2;
//增量取值為除以2向下取整
}while
(h>0)
;for
(i=0
;i)printf
("%d "
,r[i]);
}
分析總結
希爾排序的時間效能是優於直接插入排序的,因為不是每個子串行都需要排序,這樣在排序次數上得到了減少,並且每個子串行元素少於初序列,所以排序時需要比較和移動的次數也遠少於初序列,在最後增量為1時,序列大部分元素已經趨於有序,所以排序的次數和難度也大幅度減少了。
經簡單的上機實驗驗證,希爾排序的執行速度的卻要比直接插入排序的快,我利用迴圈,輸入1000,999,998……,1共1000個數,且都是反序。觀察兩個程式執行時間,看得出希爾排序比直接插入排序快了10ms左右,附圖如下(左側為直接插入排序,右側為希爾排序)。
關於希爾排序的時間複雜度目前還沒有明確的定論,因為增量的選擇會影響希爾排序的效能,起初shell提出的是除以2向下取整(希爾增量),後來也有說全取奇數,也有說取素數,可能根據不用的序列選擇不同的增量會對希爾排序的效能有很大影響,但肯定優於直接插入排序的o(n
2n^2
n2),目前有證明希爾排序平均時間複雜度可以降到o(n
nn1.3)。
所以希爾排序的時間複雜度就暫時寫為o(n
nn1.3)~o(n
2n^2
n2)空間複雜度s(n
nn)=o(1)
希爾排序是不穩定的,我們可以看到第一輪結束時,兩個28的前後順序出現了變化。
(排序的穩定性是指,初始序列中相同的資料在排序後的相對位置是否發生變化,如果變化,則排序不穩定。在本例中,雖然最後兩個28的相對順序沒變化,但是在第一輪排序過程中,兩個28的相對位置發生了變化,就說明排序有不穩定的風險,只是恰好之後的排序中,28的位置又發生了改變而已。可以驗證序列:46 28 37 28』 19
初始增量為2,一輪排序後為28' 19 37 46 28
,最後排序結果為19 28' 28 37 46
,兩個28的相對位置發生了變化。)
寫在最後
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...
排序演算法 希爾排序
摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...
排序演算法 希爾排序
希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...