希尔排序
希尔排序是增量为h的插入排序算法。插入排序算法比较和移动的增量为1,如果待排序元素在最后一个,则需要移动n-1个位置才能移到正确的位置。希尔排序根据待排序序列的无序性,将增量变为h,成为比较h增量的子数组(数组较小,无序)就可以使比较的位置可以是h。
Java实现
public class ShellSort {
public static void main(String[] args) {
Integer[] a = {3,6,3,2,8,9,7,1,0,8};
ShellSort.sort(a);
System.out.println(Arrays.toString(a));
}
@SuppressWarnings("unchecked")
public static void sort(@SuppressWarnings("rawtypes") Comparable[] a) {
int h = 1;
while (h < a.length/3)
h = 3 * h + 1;
while(h >= 1) {
for (int i = h; i < a.length; i++) {
//将a[j] 插入到 a[j -h], a[j -2h]...中
for (int j = i; j >= h && a[j].compareTo(a[j - h]) < 0; j = j - h) {
Comparable temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
}
}
//增长函数
h = h / 3;
}
}
}
排序过程
每次排序的过程都是h为增量的数组排序
当增量为1时,数组基本已经排序