來源百度百科:html
希爾排序(Shell's Sort)是插入排序的一種又稱「縮小增量排序」(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因D.L.Shell於1959年提出而得名。
從上面咱們很容易看出來,它是插入排序的高級版java
回顧一下插入排序:算法
將數據插入到已有序的數列中shell
既然希爾排序是插入排序的高級版,那它作了哪些優化呢??讓咱們來看看:數組
從直觀上看希爾排序:微信
那麼,上面那裏說了將一個序列分紅好幾個序列,那麼到底怎麼分呢?好比有10個元素的序列,分紅幾個才合適?每次縮減又是多少呢?優化
從專業的角度上講,將一個序列分紅好幾個序列,用一個數來表示:那個數稱爲增量。顯然的是,增量是不斷遞減的(直到增量爲1)spa
每每的:若是一個數列有10個元素,咱們第一趟的增量是5,第二趟的增量是2,第三趟的增量是1。若是一個數列有18個嚴肅,咱們第一趟的增量是9,第二趟的增量是4,第三趟的增量是2,第四趟的增量是1.net
很明顯咱們能夠用一個序列來表示增量:{n/2,(n/2)/2...1}
,每次增量都/2
code
如今咱們有一個數組,該數組有6個元素
int[] arrays = {2, 5, 1, 3, 4, 6};
排序前:
{2,3}
,{5,4}
,{1,6}
第一趟排序:
對三個數組分別進行插入排序,所以咱們三個數組獲得的結果爲{2,3}
,{4,5}
,{1,6}
{2, 4, 1, 3, 5, 6}
第二趟排序:
{2, 4, 1, 3, 5, 6}
當作一個數組(從宏觀上是有序的了),對其進行插入排序,直至有序 可能我舉的例子不夠好(沒看到很好的效果),咱們來看看網上的圖片,加深一下希爾排序的過程:
PS:圖片來源網上(侵刪)
public static void shellSort(int[] arrays) { //增量每次都/2 for (int step = arrays.length / 2; step > 0; step /= 2) { //從增量那組開始進行插入排序,直至完畢 for (int i = step; i < arrays.length; i++) { int j = i; int temp = arrays[j]; // j - step 就是表明與它同組隔壁的元素 while (j - step >= 0 && arrays[j - step] > temp) { arrays[j] = arrays[j - step]; j = j - step; } arrays[j] = temp; } } }
咱們發現希爾排序代碼其實很是簡單(相比對堆排序),理解起來也不難,就用增量來將數組進行分隔,直到增量爲1。底層乾的仍是插入排序乾的活~
參考資料:
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠 關注微信公衆號:Java3y