插入排序之希尔排序(缩小增量排序)Java代码

插入排序之希尔排序(缩小增量排序)Java代码

概念:希尔排序简单的来说就是将要排序的序列通过取其步长把整个要排序的序列按照步长分成几个组,最后再这几个组内部进行直接插入排序。

步长的取法:排序序列长度除以2并向下取整后面,直到步长的长度为1就不需要在取步长。不懂看后面的实列

基本思想:第一步:通过步长计算方法将要排序的序列按步长分组

                  第二步:在分组后的序列中进行组内的直接插入排序

                  第四步:重复第一步和第二步,直到步长为一时,进行最后的一次组内的直接插入排序,其排序结果就是原序列的希尔排序的果。

实列:

      

                     将要排序的序列是:3 6 5 2 5 1 4

                     那么第一步长就是:d1 = 7/2 =3(向下取整)  可以将该序列分成3组

那么第一组的数就应该是:3 2 4     再进行一次直接插入排序那么现在的序列变成了 2 3 4 这一组就完成了希尔排序了

接着第二组的数就应该是:6 5        再进行一次直接插入排序那么现在的序列变成了 5 6 这一组就完成了希尔排序了

最后一组的数就应该是:    5 1        再进行一次直接插入排序那么现在的序列变成了 5 1 这一组就完成了希尔排序了

所以经过第一次d=3的步长的希尔排序后的序列变为了:2 5 1 3 6 5 4 

                    那么第二步长就是:d2 = d1/2=3/2 =1 (向下取整)  所以只能分为一组

其系列为 2 5 1 3 6 5 4 ,在进行直接插入排序就完成了对原序列的希尔排序了,结果为:1 2 3 4 5 5 6 

 

Java代码:

    public static void shellInsort(int[] arr) {
        int step,i,j;
        int temp = 0;
        for (step=arr.length/2;step>=1;step=step/2){ //第一for是用来控制步长的 取法n/2
            System.out.println("step: " + step); //查看计算的步长
            for (i=step;i<arr.length;i++){ //对每一组的数进行直接插入排序(同时进行)(i++表示的是每组同时进行直接插入排序)
                temp = arr[i];
                for (j=i-step;j>=0&&arr[j]>temp;j=j-step){
                    arr[j+step] = arr[j];
                }
                arr[j+step] = temp;
            }
        }
    }

    public static void main(String[] args) {
        int [] arr = {3,6,5,2,5,1,4,10};
        shellInsort(arr);
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
}

C代码:(核心代码部分)注意:采用了哨兵A【0】,n代表的是序列长度 dk表示步长

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值