希尔排序(Shell Sort)

 /**
     * 3.3 希尔排序: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组;
     * 所有距离为d1的倍数的记录放在同一个组中,先在各组内进行直接插入排序;
     * 取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1);
     * 即所有记录放在同一组中进行直接插入排序为止,该方法实质上是一种分组插入方法.
     * 
     * EX: int[] nums={8,1,4,2,23,10}; <
     * 
     * d=length/2=3    8,1,4,2,23,10
     *                 |     |     
     *                 2,1,4,8,23,10
     *                     
     *                 2,1,4,8,23,10
     *                   |     |   
     *                 2,1,4,8,23,10
     *                 
     *                 2,1,4,8,23,10
     *                     |      |   
     *                 2,1,4,8,23,10
     *                         
     *      d=d/2=1    2,1,4,8,23,10
     *                 | | | | |  |
     *                 1,2,4,8,10,23
     *                 
     * 希尔排序是不稳定的.
     * 希尔排序的时间性能优于直接插入排序.
     * 希尔排序的平均时间复杂度为O(nlogn).
     * 
     */

    public static void shellSort(int[] nums) {
        int d=nums.length;
        int insert;
        do{
            d/=2;
            for(int i=0;i<d;i++){
                for(int j=i+d;j<nums.length;j=j+d){
                    if(nums[j]<nums[j-d]){
                        insert=nums[j];
                        for(int k=j-d;k>=0;k=k-d){
                            nums[k+d]=nums[k];
                            if(k==i){
                                nums[i]=insert;
                            }
                            else if(insert>=nums[k-d]){
                                nums[k]=insert;
                                break;
                            }

                        }
                    }
                }
            }
        }while(d!=1);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值