看圖輕鬆理解數據結構與算法系列(希爾排序)

前言

推出一個新系列,《看圖輕鬆理解數據結構和算法》,主要使用圖片來描述常見的數據結構和算法,輕鬆閱讀並理解掌握。本系列包括各類堆、各類隊列、各類列表、各類樹、各類圖、各類排序等等幾十篇的樣子。mysql

希爾排序

希爾排序是希爾(Donald Shell)提出的一種排序方法,也屬於插入排序,可是簡單插入排序的高效版本,也稱爲縮小增量排序。基本思想是將待排序元素進行增量分組,而後在分組組內進行插入排序,隨着增量的減小,每一個分組組內的元素愈來愈多,直至增量減至1時,全部元素都分到同一個組內,執行插入排序後完成整個排序操做。算法

排序要點

  1. 選取一個小於全部待排序元素數量n的整數i_1做爲第一個增量,對所有元素進行分組,分組的依據是全部距離爲i_1的倍數的記錄分到同一組。
  2. 對分好的組,在組內進行直接插入排序。
  3. 接着取第二個增量i_2,其中i_2<i_1,而後根據新的增量繼續分組並在組內進行直接插入排序。
  4. 重複第3步直到增量等於1,即全部記錄都在同一分組中,再進行直接插入排序,完成排序。

希爾排序過程當中通常能夠初次取全部元素數量的一半爲增量,之後每次減半,直到增量爲1。sql

排序過程

假設咱們有以下7個元素,分別爲84, 25, 59, 71, 62, 16, 34,如今進行希爾排序。網絡

image

第一輪選取全部元素數量的一半做爲增量,即7/2,取3,因此第一輪增量爲3,那麼第一組分組就是索引爲0,3,6對應的元素,即84,71,34,對其進行插入排序操做,數據結構

image

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

image

71小於84,因此84後移到71原來的位置,機器學習

image

接着將組內第三個元素34插入到已排序序列中,首先與84比較,數據結構和算法

image

34小於84,因此84後移,而後繼續與71比較,學習

image

34小於71,因此71後移,34放進去。而後開始處理第二組分組,第二組分組就是索引爲1,4對應的元素,即25,62,對其進行插入排序操做,.net

image

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

image

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

image

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

image

16小於59,因此59後移而16前移。至此處理完增量爲3的狀況。

image

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

image

25小於34,因而34後移,

image

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

image

16小於34,因而34右移,接着16與25比較,

image

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

image

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

image

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

image

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

image

62小於71,因而71後移,接着62與34比較,

image

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

image

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

image

59小於71,因而71後移,而後繼續與62比較,

image

59小於62,因而62也後移,而後繼續與34比較,

image

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

image

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

image

71小於84,因此不移動,此時已完成全部元素的希爾排序操做。

image

-------------推薦閱讀------------

個人開源項目彙總(機器&深度學習、NLP、網絡IO、AIML、mysql協議、chatbot)

爲何寫《Tomcat內核設計剖析》

個人2017文章彙總——機器學習篇

個人2017文章彙總——Java及中間件

個人2017文章彙總——深度學習篇

個人2017文章彙總——JDK源碼篇

個人2017文章彙總——天然語言處理篇

個人2017文章彙總——Java併發篇


跟我交流,向我提問:

歡迎關注:

相關文章
相關標籤/搜索