17. 排序--希爾排序

希爾排序

希爾排序是插入排序的改進,增加了間隔排序(間隔排序算法與插入排序相似),最後進行插入排序

算法原理

  • 定義增量序列DM>DM1>...>D1=1
  • 對每個Dk 進行”Dk 間隔“排序(k=M,M1,...,1
  • 注意:”Dk 間隔“有序的序列,在執行”Dk1 間隔“排序後,仍然是”Dk 間隔“有序的

原始希爾排序實現

原始增量序列:DM=N/2,Dk=Dk+1/2

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=2k1 :相鄰元素互質
    • 最壞情況:T=Θ(N3/2)
    • 猜想:Tavg=O(N5/4)
  • Sedgewick增量序列
    • {1,5,19,41,109,...}94i92i+14i32i+1
    • 猜想:Tavg=O(N7/6)Tworst=O(N4/3)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章