希爾排序
希爾排序是插入排序的改進,增加了間隔排序(間隔排序算法與插入排序相似),最後進行插入排序
算法原理
- 定義增量序列
DM>DM−1>...>D1=1 - 對每個
Dk 進行”Dk− 間隔“排序(k=M,M−1,...,1 ) - 注意:”
Dk− 間隔“有序的序列,在執行”Dk−1− 間隔“排序後,仍然是”Dk− 間隔“有序的
原始希爾排序實現
原始增量序列:
void Shell_Sort(ElementType[] A, int N) {
for (D = N/2; D > 0; D /= 2) {
for (P = D; P < N; P++) {
Tmp = A[P];
for (i = P; i >= 0 && A[i - D] > Tmp; i -= D)
A[i] = A[i - D];
A[i] = Tmp;
}
}
}
- 最壞情況:當前幾次增量序列做排序時沒有改變序列順序,依靠最後的1間隔排序(直接插入排序)才完成整個序列的排序。時間複雜度爲
T=Θ(N2) - 穩定性:由於多次插入排序,一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以希爾排序是不穩定的
更多的增量序列
原始的增量序列,因爲增量元素不互質,則小增量可能根本就不起作用。這裏引入兩種增量序列來解決
- Hibbard增量序列
Dk=2k−1 :相鄰元素互質- 最壞情況:
T=Θ(N3/2) - 猜想:
Tavg=O(N5/4)
- Sedgewick增量序列
{1,5,19,41,109,...} :9∗4i−9∗2i+1 或4i−3∗2i+1 - 猜想:
Tavg=O(N7/6) ,Tworst=O(N4/3)