一、基本思想
二、希尔排序法的基本原理
三、希尔排序法的简单实现
public class ShellSort {
private ShellSort() {
}
public static <E extends Comparable<E>> void sort(E[] data) {
int h = data.length / 2;
while (h >= 1) {
for (int start = 0; start < h; start++) {
// 对 data[start,start + h ,start + 2h, start + 3h] ,进行插入排序
for (int i = start + h; i < data.length; i += h) {
E t = data[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
data[j] = data[j - h];
}
data[j] = t;
}
}
h /= 2;
}
}
} 四、希尔排序法的性能
五、换个方式实现希尔排序法
public static <E extends Comparable<E>> void sort(E[] data) {
int h = data.length / 2;
while (h >= 1) {
// 对 data[ h , n] ,进行插入排序
for (int i = h; i < data.length; i ++) {
E t = data[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
data[j] = data[j - h];
}
data[j] = t;
}
h /= 2;
}
} public static void main(String[] args) {
int n = 1000000;
Integer[] arr = ArrayGenerator.generateRandomArray(n, n);
Integer[] arr3 = Arrays.copyOf(arr,arr.length);
SortingHelper.sortTest("ShellSort", arr);
SortingHelper.sortTest("MergeSortBU", arr3);
} 六、希尔排序——步长序列
public static <E extends Comparable<E>> void sort2(E[] data) {
int h = 1;
while (h < data.length) {
// 1,4,13,40
h = h * 3 + 1;
}
while (h >= 1) {
// 对 data[ h , n] ,进行插入排序
for (int i = h; i < data.length; i++) {
E t = data[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(data[j - h]) < 0; j -= h) {
data[j] = data[j - h];
}
data[j] = t;
}
h /= 3;
}
} 本文作者为DBC,转载请注明。



