一、先取一個小於n的整數d1做爲第一個增量,把序列分紅d1個組。 java
二、全部距離爲d1的倍數元素放在同一個組中,在各組內警醒直接插入排序。 web
三、取第二個增量d2<d1重複尚需的分組和排序。 算法
四、直至所取的增量dt=1(dt<dt-1<···· <d2<d1),即全部元素都放在同一組中進行插入排序爲止。 shell
第一次,d1=5; 第二次,d2=3; 第三次 , d3=1; 數組
動畫中相同顏色爲一組,組內先執行插入排序。 app
package test.algorithm.FastSlowPointer; public class ShellSort { /** * 希爾排序 * @param list */ public static void shellSort(int[] list){ int gap = list.length; int temp = 0; do{ //增量 gap = gap/3 + 1; for(int i = gap;i<list.length;i++){ if(list[i]<list[i-gap]){ temp = list[i]; int j = i-gap; //比第i個大的元素所有向後移動gap位 //空出的位置是j+gap while(j>=0 && list[j]>temp){ list[j+gap] = list[j]; j = j-gap; } //插入第i個元素 list[j+gap] = temp; } } }while(gap>1); } public static void main(String[] args) { int[] list = {5,2,6,0,3,9,1,7,4,8}; shellSort(list); System.out.print("打印數組:"); for(int i :list){ System.out.print(i+" "); } } }