排序演算法(四) Shell排序

2021-08-21 17:10:22 字數 741 閱讀 4725

排序思路:

該演算法是直接插入排序的優化演算法。採用粗略排序到精確排序的思路,首先粗略的,按照步長step=len/2,選取元素(相距step遠為一組)執行直接排序演算法,此時元素都是兩兩為一組。排序好後,在將步長放短,step=step/2。依次類推。這樣的好處在於,每次執行直接插入排序時,排序複雜度都會降低,減少了排序次數。

樣例:

1)設定步長step=6/3=2,陣列將從起始開始,每兩個相鄰step遠的元素為一組。

執行直接排序後

結果:

共進行了3次排序。

2)設定步長step=2/2=1

直接對上述陣列進行排序

3)排序結束。

分析過程可知,通過前期的步長分組,提前進行小組內的排序,為後續步驟打下基礎,減少了後續的比較次數和排序步驟。shell排序在陣列規模較大時,表現要好於直接排序演算法。

c實現:

void shellsort(int array, int len)

array[j+step]=tmp;

}step = step/2;

}}

時間複雜度最差為o(n2),最好為o(n ^ (1.3) ) 。

shell排序是不穩定排序,依賴於步長step,最佳時間複雜度需要推算,上述最好值參考自別處。

排序演算法 Shell排序

基本思路 先把陣列分成差量為d 的幾組,即 a 1 a 1 d a 1 d d 為一組 a 2 a 2 d a 2 d d 為一組 然後依次對每組進行插入排序。各組排完序後 在 取第二個增量d2 d 重複上述 分組和排序。直到 增量 d 1 即 所有的數都放在同一組中進行插入排序。下面是 c語言實現...

常見排序演算法 shell排序

shell排序是對插入排序的乙個改裝,它每次排序把序列的元素按照某個增量分成幾個子串行,對這幾個子串行進行插入排序,然後不斷的縮小增量擴大每個子串行的元素數量,直到增量為一的時候子串行就和原先的待排列序列一樣了,此時只需要做少量的比較和移動就可以完成對序列的排序了。1 2 default to so...

Shell排序演算法

shell排序演算法嚴格來說是基於插入思想,又稱為希爾排序或縮小增量排序。shell排序演算法的排序流程如下 1 將有n個元素的陣列分成n 2個數字序列,第1個資料和第n 2 1個資料為一對,等等,以此類推。2 一次迴圈使每乙個序列對排好順序。3 變為n 4個序列,再次排序。4 不斷重複上述過程,隨...