public class ShellSort { public static void main(String[] args) { int[] arr = new int[] {9,8,7,6,5,4,3,2,1,0}; shellSort(arr); System.out.println(Arrays.toString(arr)); } /** * 1.分组有什么用? * 可以提前调整数据的位置,减少后面移动的次数。 * 2.为什么缩小增量进行分组排序,最后数组就有序了? * 不管初始增量为多少,最后都会变成1,进行一次完整的插入排序,所以最后整个数组有序。 */ public static void shellSort(int[] arr) { for(int gap = arr.length / 2; gap > 0; gap /= 2) { for(int i = 1; i < arr.length; i++) { //当i < gap时,没有交换的对象 if(i >= gap) { int insertVal = arr[i]; int insertIndex = i - gap; while(insertIndex >= 0 && arr[insertIndex] > insertVal) { arr[insertIndex+gap] = arr[insertIndex];//后移gap个单位 insertIndex -= gap; } arr[insertIndex+gap] = insertVal; } } } } }