一、基本思想
二、希尔排序法的基本原理
三、希尔排序法的简单实现
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,转载请注明。