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;
}
}
}
}
}