希尔排序借用了插入排序,算法先将要排序的一组数按某个增量gap(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差gap.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(gap/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
public class ShellSort {
public static void main(String[] args) {
int[] arr = {2, 64, 1, 33, 10, 5, 9, 4, 7};//待排序列
for (int item : arr) {
System.out.print(item + "\t");
}
System.out.println();
shellSort(arr);
for (int item : arr) {
System.out.print(item + "\t");
}
}
public static void shellSort(int[] arr) {
//增量gap,并逐步缩小增量
for (int gap = arr.length / 2; gap > 0; gap /= 2) {//gap从大到小,并往小的靠拢(floor)
//从第gap个元素,逐个对其所在组进行直接插入排序操作
for (int i = gap; i < arr.length; i++) {
int j = i;
while (j - gap >= 0 && arr[j] < arr[j - gap]) {
//插入排序采用交换法,有点像冒泡排序
swap(arr, j, j - gap);
j -= gap;
}
}
}
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}