八大排序之希尔排序

希尔排序

学希尔排序之前,必须要有插入排序算法的基础
插入排序算法:八大排序之插入排序

可以这么说,希尔排序就是对插入排序的优化
为什么这么说呢?
场景:2,3,4,5,6 ,1
现在轮到把 1 插入到正确的位置上, 很明显肯定是插在第一位,即:1 2 3 4 5 6,但是可以看出要比较5次,虽然5次并不多,但是在大数据量的情况下,这个比较次数就有些恐怖了;
这时希尔排序横空出世,其算法思路很简单,即:不再像插入排序一样,一个一个的往前的比较;而是跨距离比较。
上面的例子:2,3,4,5,6 ,1
思路:如果这个时候我们直接拿 1 与 2 比较,就可以一次插入到正确的位置了,并且跨了5个距离。
不过距离也不是乱设置的,距离是按照:N/2,N/4,N/8…一直到 N/2^k == 1 为止,其中N代表数字的个数,K取值范围[1,正无穷),

综合例子:1 2 3 4 5 6 7 8,注意:1 2 … 并不是实际比较的数字,而是位置
希尔排序思路:
第一轮: 距离为8/2=4,5跟1比较,6跟2,7跟3,8跟4
第二轮: 距离为8/4=2, 3 --1,4 – 2 ,5 – 3,5 – 1,6 – 4,6 – 2, 7 --5,7 – 3 ,7 – 1 …
第三轮:距离为1 , 2 – 1 ,3 --2 , 3 – 1, 4 – 3, 4 – 2,4 – 1 …

    public static void shell(int[] arr){
        for (int i=arr.length/2; i>0 ; i=i/2 ){
            for (int j=i;j<arr.length;j++){

                int tempIndex = j;
                int temp = arr[tempIndex];

                if (arr[tempIndex]<arr[tempIndex-i]){

                    while (tempIndex-i>=0 && temp<arr[tempIndex-i]){
                        arr[tempIndex]=arr[tempIndex-i];
                        tempIndex = tempIndex - i;
                    }
                    arr[tempIndex]=temp;
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值