“希尔排序法”是 D.L.Shell 在 1959 年 7 月发明的一种排序法,而该排序法直接以发明者命名。其排序法的原理有点像插入排序法,但它可以减少数据搬移的次数。排序的原则是将数据区分成特定间隔的几个小区块,以插入排序法排完区块内的数据后再渐渐减少间隔的距离。

演算过程

 数据结构-希尔排序法 算法

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

希尔法分析

  1. 任何情况下的时间复杂度均为 O(n^(3/2))
  2. 相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定排序
  3. 只需一个额外空间,所以空间复杂度是最佳的
  4. 此排序法适用于数据大部分都已排序完成的情况

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");
    }

}
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄