看圖輕鬆理解資料結構與算法系列(希爾排序)
推出一個新系列,《看圖輕鬆理解資料結構和演算法》,主要使用圖片來描述常見的資料結構和演算法,輕鬆閱讀並理解掌握。本系列包括各種堆、各種佇列、各種列表、各種樹、各種圖、各種排序等等幾十篇的樣子。
希爾排序
希爾排序是希爾(Donald Shell)提出的一種排序方法,也屬於插入排序,但是簡單插入排序的高效版本,也稱為縮小增量排序。基本思想是將待排序元素進行增量分組,然後在分組組內進行插入排序,隨著增量的減少,每個分組組內的元素越來越多,直至增量減至1時,所有元素都分到同一個組內,執行插入排序後完成整個排序操作。
排序要點
- 選取一個小於所有待排序元素數量n的整數 作為第一個增量,對全部元素進行分組,分組的依據是所有距離為 的倍數的記錄分到同一組。
- 對分好的組,在組內進行直接插入排序。
- 接著取第二個增量 ,其中 < ,然後根據新的增量繼續分組並在組內進行直接插入排序。
- 重複第3步直到增量等於1,即所有記錄都在同一分組中,再進行直接插入排序,完成排序。
希爾排序過程中一般可以初次取所有元素數量的一半為增量,以後每次減半,直到增量為1。
排序過程
假設我們有如下7個元素,分別為 84, 25, 59, 71, 62, 16, 34
,現在進行希爾排序。

第一輪選取所有元素數量的一半作為增量,即7/2,取3,所以第一輪增量為3,那麼第一組分組就是索引為0,3,6對應的元素,即84,71,34,對其進行插入排序操作,

把84當做已排序序列,接著準備將組內第二個元素71插入到已排序序列中,

71小於84,所以84後移到71原來的位置,

接著將組內第三個元素34插入到已排序序列中,首先與84比較,

34小於84,所以84後移,然後繼續與71比較,

34小於71,所以71後移,34放進去。然後開始處理第二組分組,第二組分組就是索引為1,4對應的元素,即25,62,對其進行插入排序操作,

把25當做已排序序列,接著將組內第二個元素62插入到已排序序列中,

25小於62,所以不移動。然後開始處理第三組分組,第三組分組就是索引為2,5對應的元素,即59,16,對其進行插入排序操作,

把59當做已排序序列,接著將組內第二個元素16插入到已排序序列中,

16小於59,所以59後移而16前移。至此處理完增量為3的情況。

第二輪增量為上一輪增量的二分之一,即3/2,取1,所以第二輪增量為1,此時所有元素組成同一個分組,對該組進行插入排序操作,首先將34當成已排序序列,準備將25插入到已排序序列,

25小於34,於是34後移,

繼續將下一個元素插入已排序序列中,16與34比較,

16小於34,於是34右移,接著16與25比較,

16小於25,25後移,16放進對應位置,

繼續將下一個元素插入已排序序列中,71與34比較,

34小於71,不移動,71放回原來位置,

繼續將下一個元素插入已排序序列中,62與71比較,

62小於71,於是71後移,接著62與34比較,

34小於62,不移動,62放到對應位置,

繼續將下一個元素插入已排序序列中,59與71比較,

59小於71,於是71後移,然後繼續與62比較,

59小於62,於是62也後移,然後繼續與34比較,

34小於59,於是34不移動,59放到對應位置,

繼續將下一個元素插入已排序序列中,已經是最後一個元素了,84與71比較,

71小於84,所以不移動,此時已完成所有元素的希爾排序操作。

-------------推薦閱讀------------
ofollow,noindex">我的開源專案彙總(機器&深度學習、NLP、網路IO、AIML、mysql協議、chatbot)
我的2017文章彙總——Java及中介軟體
我的2017文章彙總——JDK原始碼篇
跟我交流,向我提問:

歡迎關注:
