1. 程式人生 > >看圖輕鬆理解資料結構與算法系列(希爾排序)

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

前言

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

希爾排序

希爾排序是希爾(Donald Shell)提出的一種排序方法,也屬於插入排序,但是簡單插入排序的高效版本,也稱為縮小增量排序。基本思想是將待排序元素進行增量分組,然後在分組組內進行插入排序,隨著增量的減少,每個分組組內的元素越來越多,直至增量減至1時,所有元素都分到同一個組內,執行插入排序後完成整個排序操作。

排序要點

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

希爾排序過程中一般可以初次取所有元素數量的一半為增量,以後每次減半,直到增量為1。

排序過程

假設我們有如下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,對其進行插入排序操作,

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

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

跟我交流,向我提問:

歡迎關注: