從排序開始(二) 希爾排序

2021-12-30 01:20:15 字數 930 閱讀 5166

希爾排序,是對直接插入排序的改進版本,又稱增量縮小排序,實質上是一種分組插入排序。

基本思想是 先取第乙個增量step,以該序列內所有下標相差 step 的元素作為一組,如 array[0], array[0 + step], array[0 + step*2].....作為一組,array[1], array[1 + step], array[1 + step*2]....作為一組,然後對這些分組分別進行直接插入排序,然後減小增量,重複進行上面操作,到最後 step = 1,這時序列已基本有序,對陣列再次進行直接插入排序,這種情況下的直接插入排序複雜度為 o(n),而且保證了最後的結果是有序數列。

希爾排序的複雜度比較複雜,主要跟步長的選擇有關,大概是 o(n logn^2),一般認為就是介於 o(n^2) 和 o(n logn) 之間。最好步長比較複雜,一般第一次取序列的一半,以後每次減半,直到步長為1。

對於希爾排序為什麼明顯優於直接插入排序,讓我們看看維基:「希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,需排序的資料幾乎是已排好的了(此時插入排序較快)。」「可能希爾排序最重要的地方在於當用較小步長排序後,以前用的較大步長仍然是有序的。比如,如果乙個數列以步長5進行了排序然後再以步長3進行排序,那麼該數列不僅是以步長3有序,而且是以步長5有序。如果不是這樣,那麼演算法在迭代過程中會打亂以前的順序,那就不會以如此短的時間完成排序了。」

複雜度:

最差時間複雜度:根據步長序列的不同而不同。 已知最好的 o(n logn^2)

最優時間複雜度:o(n)

平均時間複雜度:根據步長序列的不同而不同。

最差空間複雜度:o(n)

穩定性:不穩定

實現:void shellsort(int data, int n)

}  

排序(二) 希爾排序

希爾排序 shell s sort 又稱 縮小增量排序 diminishing increment sort 它也是一種屬於插入排序類的方法,但在時間效率上較 排序 一 中的幾種排序方法有較大的改進。基本思想 先將整個待排記錄序列分割成為若干個子串行分別進行直接插入排序,待整個序列中的記錄 基本有序...

排序二 希爾排序

希爾排序又稱為縮小增量排序,它是一種插入排序,是直接插入排序的優化。與直接插入排序不同的是它按照間距gap分組,對間距為gap的數進行插入排序。預排序 令gap x,對間距為x的資料進行插入排序,gap數值逐漸減小gap gap 3 1 此時接近有序 直接插入排序 當gap 1 為有序數列 希爾排序...

排序 二 希爾排序,堆排序

1.原理 希爾排序法又稱縮小增量法。希爾排序法的基本思想是 先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達 1時,所有記錄在統一組內排好序。希爾排序是對直接插入排序的優化。當gap 1時都是預排序,...