“希尔排序法”是 D.L.Shell 在 1959 年 7 月发明的一种排序法,而该排序法直接以发明者命名。其排序法的原理有点像插入排序法,但它可以减少数据搬移的次数。排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少间隔的距离。
演算过程
希尔法分析
- 任何情况下的时间复杂度均为 O(n^(3/2))
- 相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定排序
- 只需一个额外空间,所以空间复杂度是最佳的
- 此排序法适用于数据大部分都已排序完成的情况
example1
/** * 希尔排序法 * */ public class ShellSort { public static void main(String[] args) { int data[] = new int[] {6, 9, 2, 3, 4, 7, 5, 1}; System.out.print("原始数据:"); showData(data); shell(data); System.out.print("排序后的数据:"); showData(data); } private static void shell(int data[]) { int length = data.length; int count = 2; int block = length/count; int i, k, tmp; while (block != 0) { for (i = block; i < length; i++) { tmp = data[i]; k = i; while ((k = k-block) >= 0 && tmp < data[k]) { data[k+block] = data[k]; // data[k] = tmp; } data[k+block] = tmp; } block = block/count; showData(data); } } private static void showData(int data[]) { for (int i = 0; i < data.length; i++) { System.out.printf("[%d]", data[i]); } System.out.printf("%n"); } }