算法学习笔记——希尔排序

排序案例


925611178

首先我们得了解一点希尔排序就是快速排序的升级版,在下面的过程中我们来演示它的原理是怎么样的。
如上序列中有8 个数,我们一般取增量gap=Arr.length/2
(gap也就意味着我们需要分组的个数)
在此案例中gap初始值为4,我们就可以分为
(9,11)(2,1)(5,7)(6,8)这四组数,对这四组数进行排序得到
(9,11)(1,2)(5,7)(6,8)
所以原序列变为

915611278

这样一轮排序就结束了,gap/=2 即gap=2,我们就将此序列分为俩组
(9,5,11,7)(1,6,2,8)对这二组数进行排序得到
(5,7,9,11)(1,2,6,8)
所以原序列变为

517296118

gap/=2 即gap=1,我们就将此序列分为一组
(5,1,7,2,9,6,11,8) 进行比较,此序列对于原序列来说就会相对有序一些,在此案例中我们可能看不太出来,但是在序列较长的情况下就会比较明显了。
排序完之后
原序列变为

125678911

此时gap/=2 即gap=0,排序结束


下面附上源码实现

package sort;

import java.util.Arrays;

public class Shell {
    public static int[] Sort(int[] sourceArray){
        int arr []= sourceArray.clone();
        int N =arr.length;
        int gap =N/2; //增量设置
        for (;gap>0;gap/=2) {
            for (int i = gap; i < arr.length; i++) {
                int tmp = arr[i]; //记录需要插入的数
                int j = i;
                while (j- gap >=0 && tmp < arr[j - gap]) {//当插入的数小于当前值时
                    arr[j] = arr[j - gap]; //向后移动一位
                    j=j-gap;
                }
                if (j != i) { //存在比其小的数,则插入
                    arr[j] = tmp;
                }
            }
        }

        return arr;
    }

    public static void main(String[] args) {
        int arrs[]={50,11,2,4,5,48,90,20,19};
        System.out.println(Arrays.toString(Sort(arrs)));

    }

}


此文章创于本人学习时的记录,如有错误还请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值