希尔排序是对于插入排序的一种改进算法
它的思想是使数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组。 在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现更小的h有序创造方便。用这种方式,对于任意以1结尾的h序列,我们都能够将数组排序,这就是希尔排序.
希尔排序的难点在于h(递增序列)的选择。
public class Shell {
public static void sort(Comparable[] a) {
int n = a.length;
int h = 1;
while (h < n/3) {
h = 3 * h + 1;
}
while (h >= 1) {
// 将数组变为h有序
for (int i = h; i < n; i++) {
//将a[i]插入到a[i-h], a[i-2*h], a[i-3*h]...a[h]之中
for (int j = i; j >= h; j -= h) {
if (less(a[j], a[j - h])) {
exchange(a, j, j - h);
}
}
}
h = h/3;
}
}
public static void exchange(Comparable[] a, int i, int j) {
Comparable tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public static boolean less(Comparable a, Comparable b) {
return a.compareTo(b) < 0;
}
}