希爾排序(下)

2021-06-08 17:16:31 字數 2549 閱讀 8338

好了,為了能夠真正弄明白希爾排序的演算法,我們還是老辦法——模擬計算機在執行演算法時的步驟還研究演算法到底是如何進行排序的。

希爾排序演算法**如下。

void

shellsort(sqlist *l)

217}18

}19while

(increment

>1);

20}1) 程式開始執行,此時我們傳入的sqlist引數的值為length=9,r[10]=。這就是我們需要等待排序的序列,如圖9-6-4所示。

2) 第4行,變數increment就是那個「增量」,我們初始值讓它等於待排序的記錄數。

3) 第5~19行是乙個do迴圈,它提終止條件是increment不大於1時。其實也就是增量為1時就停止迴圈了。

4) 第7行,這一句很關鍵,但也是難以理解的地方,我們後面還要談到它,先放一放。這裡執行完成後,increment=9/3+1=4。

5) 第8~17行是一for迴圈,i從4+1=5開始到9結束。

6) 第10行,判斷l.r[i]與l.r[i-increment]大小,l.r[5]=3

7) 迴圈繼續,i=6,l.r[6]=7>l.r[i-increment]=l.r[2]=1,因此不交換兩者資料。如圖9-6-6。

8) 迴圈繼續,i=7,l.r[7]=4

9) 迴圈繼續,i=8,l.r[8]=6

10) 迴圈繼續,i=9,l.r[9]=2

最終第一輪迴圈後,陣列的排序結果為圖9-6-10所示。細心的同學會發現,我們的數字1、2等小數字已經在前兩位,而8、9等大數字已經在後兩位,也就是說,通過這樣的排序,我們已經讓整個序列基本有序了。這其實就是希爾排序的精華所在,它將關鍵字較小的記錄,不是一步一步地往前挪動,而是跳躍式地往前移,從而使得每次完成一輪迴圈後,整個序列就朝著有序堅實地邁進一步。

11) 我們繼續,在完成一輪do迴圈後,此時由於increment=4>1因此我們需要繼續do迴圈。第7行得到increment=4/3+1=2。第8~17行for迴圈,i從2+1=3開始到9結束。當i=3、4時,不用交換,當i=5時,需要交換資料,如圖9-6-11

12) 此後,i=6、7、8、9均不用交換。如圖9-6-12

13) 再次完成一輪do迴圈,increment=2>1,再次do迴圈,第7行得到increment=2/3+1=1。此時這就是最後一輪do迴圈了。儘管第8~17行for迴圈,i從1+1=2開始到9結束,但由於當前序列已經基本有序,可交換資料的情況大為減少,效率其實很高。如圖9-6-13,圖中箭頭連線為需要交換的關鍵字。

最終完成排序過程,如圖9-6-14。

9.6.4 希爾排序複雜度分析

通過這段**的剖析,相信大家有些明白,希爾排序的關鍵並不是隨便的分組後各自排序,而是將相隔某個「增量」的記錄組成乙個子串行,實現跳躍式的移動,使得排序的效率提高。

這裡「增量」的選取就非常關鍵了。我們在**中第7行,是用increment=increment/3+1;的方式選取增量的,可究竟應該選取什麼樣的增量才是最好,目前還是乙個數學難題,迄今為止還沒有人找到一種最好的增量序列。不過大量的研究表明,當增量序列為dlta[k]=2t-k+1

-1(0≤k≤t≤⌊log2(n+1)⌋)時,可以獲得不錯的效率,其時間複雜度為o(n3/2

),要好於直接排序的o(n2

)。需要注意的是,增量序列的最後乙個增量值必須等於1才行。另外由於記錄是跳躍式的移動,希爾排序並不是一種穩定的排序演算法。

不管怎麼說,希爾排序演算法的發明,使得我們終於突破了慢速排序的時代(超越了時間複雜度為o(n2

)),之後,相應的更為高效的排序演算法也就相繼出現了。

排序 希爾排序

希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...

排序 希爾排序

縮小增量排序 待排序列按關鍵字基本有序時,直接插入排序的效率很高 希爾排序思想 將整個待排記錄分割為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序,就可以完成整個排序工作 增量序列中的值沒有除1以外的公因子,且最後乙個增量必須等於1 子串行的構成不是逐...

排序 希爾排序

希爾排序是插入排序中的乙個分支,但是較簡單插入排序又有較大的改進,這使得它成為了歷史上第一批突破二次時間屏障的排序演算法之一哦。它是通過比較一定間隔的元素來工作的。因此希爾排序又稱為縮小增量排序。直接插入排序對於原始資料基本有序的情況下,效率較高。在此的基礎上。我們可以想辦法,使資料基本有序,然後利...