33-咸鱼学Java-Shell排序

简介

希尔排序是一种插入排序算法,它出自D.L.Shell,因此而得名。Shell排序又称作缩小增量排序。Shell排序的执行时间依赖于增量序列。
其主要操作是插入排序,不过其通过分组来进行插入。
其基本思想是
采用分组的策略 让组内有序 组内使用直接插入排序
1,尽量让每组数据变得有序
2,因为越有序越快
时间复杂度
时间复杂度O(n^1.3–1.5) 不稳定

代码

/**
     * 希尔排序
     * @param array
     */
    public static void shellSort(int[] array)
    {   //分组依据,目前希尔排序主要通过5,3,1分组,其效率最高
        //相当于将整个数组划分为n份
        int[] d = {5,3,1};
        //根据不同的情况进行插入排序
        for (int i = 0; i < d.length; i++) {
            shell(array,d[i]);
            System.out.println("第"+(i+1)+"次:"+Arrays.toString(array));
        }
    }
    /**
     * 希尔插入
     * @param array 数组
     * @param gap   分割基数
     */
    private static void shell(int[] array, int gap) {
        //临时变量
        int temp = 0;
        //内循环所需变量
        int j;
        //循环array数组,其基础为gap,每次增量为1
        for (int i = gap; i < array.length; i++) {
            //临时变量存储当前元素
            temp = array[i];
            //循环遍历array[i]之前的元素,每次减量为gap,相当于同组比较插入
            for (j=i-gap; j >=0; j-=gap) {
                //如果array[j]比当前元素大就一直向后移动
                if(array[j]>temp)
                {
                    //移动
                    array[j+gap] = array[j];
                }
                //直到array[i]比temp小或者相等
                else
                {
                    break;
                }
            }
            //将temp放到比temp小的元素之后
            array[j+gap] = temp;
        }
    }

测试

    public static void main(String[] args) {
        int [] a = {1,4,2,24,3,5,9,10,13,34,123,65,87,56,23};
        System.out.println("排序前:"+Arrays.toString(a));
        shellSort(a);
        System.out.println("结果:"+Arrays.toString(a));
    }

结果
排序前:[1, 4, 2, 24, 3, 5, 9, 10, 13, 34, 123, 65, 87, 56, 23]
第1次:[1, 4, 2, 13, 3, 5, 9, 10, 24, 23, 123, 65, 87, 56, 34]
第2次:[1, 3, 2, 9, 4, 5, 13, 10, 24, 23, 56, 34, 87, 123, 65]
第3次:[1, 2, 3, 4, 5, 9, 10, 13, 23, 24, 34, 56, 65, 87, 123]
结果:[1, 2, 3, 4, 5, 9, 10, 13, 23, 24, 34, 56, 65, 87, 123]

解析

1.将原元素分为5组
这里写图片描述
2.相同颜色,及组内进行插入排序,结果为1, 4, 2, 13, 3, 5, 9, 10, 24, 23, 123, 65, 87, 56, 34
3.将目前元素分为3组
这里写图片描述
4.相同颜色,及组内进行插入排序,结果为1, 3, 2, 9, 4, 5, 13, 10, 24, 23, 56, 34, 87, 123, 65
5.将元素分为1组,及对目前的整个数组进行直接插入排序,结果为1, 2, 3, 4, 5, 9, 10, 13, 23, 24, 34, 56, 65, 87, 123

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值