一、先取一个小于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+" "); } } }