shell排序基本思想及其复杂度分析

/*
* shell排序(希尔排序)
* 基本思想:希尔排序选取一个增量h,也就是把整个数组分成h份,对每一份进行排序。
* 然后减少增量h,重复上述过程。
* 一般我们选取的递增序列为:3*h+1   即1,4,13,40,.....
* 实现:用一个while语句求出对应数组我们所需要的最大h
* 然后在用一个外层while循环控制h,每循环一次h=h/3;直至h自减至1;
* 内层是直接插入排序算法,两个for循环嵌套,外层for循环用来控制i  - a.length的自增
* 内层for循环用来找到i需要插入的位置。
* 复杂度分析:
* 时间复杂度:希尔排序最好情况是数组正序,此时外层for循环执行一次+最外层while循环<n次;内层for循环不执行,  O(n)
* 最坏情况是数组逆序,外层for循环+while<n次,内层for每次都需要把n个数据向后移动一位;   O(n^2)
* 平均情况:  O(n^1.3)  站在巨人的肩膀上看问题
* 空间复杂度:
* 需要一个temp用来临时交换数据,一个h来保存增量           O(1)


*/

        public static void shellSort ( int[] a){
            int len = a.length;
            int h = 1;
            while (h < len / 3)
                h = h * 3 + 1;
            while (h > 0) {
                for (int i = h; i < len; ++i) {
                    for (int j = i; j >= h; j = j - h) {
                        if (a[j] < a[j - h]) {
                            int temp = a[j];
                            a[j] = a[j - h];
                            a[j - h] = temp;
                        }
                    }
                }
                h = h / 3;
            }

        }

Ps:博文为博主的学习笔记,算法只是按照自己的理解简单分析,初学者建议看详细的图文讲解,如果有错误,欢迎交流指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值