希尔排序

        希尔排序(Shell Sort)又称为 "缩小增量排序",其基本思想是:先将整个待排序列根据增量分割成若干个子序列,分别进行插入排序,然后再缩小增量依次进行排序,最后再对全体进行一次插入排序,因为插入排序在序列基本有序的情况下效率是很高的,所以Shell Sort 比直接插入排序有很大提高

现在我们看一下Shell Sort的完整过程,比如无序序列46、25、68、33、33、19、12、80 (增量分别为4、2、1)

初始状态:

d = 4,分为4组间隔为4的子序列,各个子序列分别进行插入排序,分别是(46、33),(25、19),(68、12),(33、80),插入排序完后的状态

d = 2,分为两组间隔为2的子序列,各个子序列进行插入排序,分别是(33、12、46、68),(19、33、25、80),插入排序完后的状态

最后d = 1,整个序列进行一次插入排序,因为此时整个序列已经基本有序了,所以插入排序的效率会很高,最后成为有序状态

需要注意的是,Shell Sort 并不是对一个子序列执行完插入排序再对执行第二个子序列,而是从第一个子序列的第二个记录开始扫描整个序列,当前记录属于那个序列就在对应的序列中进行插入操作,所以在扫描完序列后,每个子序列就已经是有序的了。下面看一下代码实现

    private static void ShellSort(int [] l, int [] dk){
        for (int aDk : dk) {
            insertSort(l, aDk);
        }
    }

    private static void insertSort(int [] l, int dk){
        if(l != null && l.length != 0){
            for (int i = dk + 1; i < l.length; i++) {
                if(l[i] < l[i - dk]){
                    l[0] = l[i];
                    int j;
                    for (j = i - dk; j > 0 && l[j] > l[0] ; j -= dk) {
                        l[j + dk] = l[j];
                    }
                    l[j + dk] = l[0];
                }
            }
            System.out.println(Arrays.toString(l));
        }
    }
效率分析:在一开始执行时,Shell Sort 增量较大,分组较多,但每组元素少,执行速度较快,之后增量变大,分组变少,每组元素数增加,但子序列是基本有序的,所以执行起来速度也是较快的,所以Shell Sort的执行效率要比插入排序好很多。

时间复杂度:在增量选取合适的条件下,Shell Sort 的时间复杂度能达到O(n3/2)

空间复杂度:等同于插入排序,只需要一个辅助空间。

稳定性:由于Shell Sort 对每段子序列进行排序,所以会导致相等元素的相对位置发生改变,所以Shell Sort 是不稳定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值