排序演算法之四 希爾排序 Shell Sort

2021-09-08 20:22:29 字數 1333 閱讀 5629

希爾排序是希爾(donald shell)於2023年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破o(n2)的第一批演算法之一。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。

希爾排序中包含了分而治之的思想,首先將乙個輸入序列根據增量分成若干個子串行,然後對每個子串行分別進行插入排序。然後減少增量,然後對繼續將序列根據增量分成若干個子串行,繼續在每個子串行中進行插入排序。一直重複這樣的動作,直到增量=1時,整個輸入序列恰被分成一組,此時整個輸入序列就完成了全部元素的排序。

希爾排序的增量序列的選擇與證明是個數學難題,此處我們使用的希爾增量根據length生成,這種增量選擇我們可以用乙個序列來表示,,稱為增量序列。其中h生成演算法如下:

int h=0;

while

(h < length)

if(h>1)

先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,具體演算法描述:

選擇乙個增量序列t1,t2,ti, tj …,1,其中ti>tj

按增量序列個數k,對序列進行k 趟排序;

每趟排序,根據對應的增量,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。當增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。

希爾排序c/c++**實現:

/**

* 希爾排序 是插入排序的改進,效率較高

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

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

* 平均時間複雜度 o(nlogn)

* 空間複雜度 o(1)

* 穩定性 不穩定

* 效率

* @param arr 陣列

* @param n 長度

*/void

shellsort

(int arr,

int n)

if(h>1)

//02將輸入序列根據增量h分割成若干個子串行,並對每個子串行進行插入排序

//逐漸縮小增量,直到小於零

while

(h>0)

arr[j+h]

=get;

//將元素插入到該位置

} h=

(h-1)/

3;//遞減增量

}}

排序演算法之Shell排序(希爾排序)

shell排序 思想 先可進行分組,再利用插入排序。分組的方法是根據步長的設定從a 0 開始,並且不大於步長,組內相鄰兩個元素的邏輯距離是gap。分組結束的標誌是gap為0,也就是已經全部按照大小排列。推薦閱讀 給定陣列shell排序,從小到大排列。include int main gap 10 2...

java排序之shell排序 希爾排序 (四)

shell排序是一種相對我之前寫的冒泡,選擇,插入排序更加高效的排序演算法 它的基層排序思想還是用的插入排序的思想,但加入了縮小增量的思想 流程如下 1 將n個元素的陣列分成n 2個序列,第1個資料與第n 2 1個資料為一對,第2個資料與第n 2 2個資料為一對.2 一次迴圈使每乙個序列對排好序。3...

排序演算法 四 希爾排序

希爾排序是插入排序的一種優化實現,比直接插入排序演算法更高效。也是第一批演算法時間複雜度突破o n 2 的演算法之一。因 d.l.shell 於 1959 年提出而得名。希爾排序是把集合資料按下標的一定增量分組,對每組使用直接插入排序演算法排序 隨著增量的減少,集合資料越來越接近整體有序。當增量減至...