排序算法——希尔排序

排序算法——希尔排序

希尔排序:是直接插入排序算法的一种更高效的改进版本。又称“缩小增量排序”(Diminishing Increment
Sort)。希尔排序是非稳定排序算法。

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量为1,即所有记录放在同一组中进行直接插入排序为止。

例如一组数组{9,8,7,6,5,4,3,2,1},增量序列的取值依次为:5、2、1。
首先,选择增量gap=9/2=5(向上取整),整个数组分成了5组,分别为【9,4】、【8,3】、【7,2】、【6,1】、【5】,对每组进行插入排序,如下所示:
在这里插入图片描述
然后缩小增量为gap=5/2=2(向下取整),整个数组分成了2组,分别为【4,2,5,8,6】、【3,1,9,7】,再对这两组进行插入排序,如下所示:
在这里插入图片描述
最后缩小增量为gap=2/2=1,整个数组分成了1组,为【2,1,4,3,5,7,6,9,8】,此时,只需对数组进行微调即可完成整个数组的排序,如下所示:
在这里插入图片描述

Java代码实现:
    public static void main(String[] args) {
    	int[] arr = {9,8,7,6,5,4,3,2,1};
    	shellSort(arr);
    }
    public static void shellSort(int[] arr) {
    	int len = arr.length;//首先选取一个增量序列
    	int gap = (int) Math.ceil(Float.valueOf(len) / 2);//先找出增量序列最大的增量值
    	System.out.println("增量值:\t"+gap);
    	while (gap > 0) {
    		for (int i = gap,z = 1; i < len; i++,z++) {
    			int tmp = arr[i];
    			int j = i - gap;
    			while (j >= 0 && arr[j] > tmp) {
    				arr[j + gap] = arr[j];
    				j -= gap;
    			}
    			arr[j + gap] = tmp;
    			System.out.format("第%d趟:\t", z);
    			for (int l : arr) {
    				System.out.print(l+",");
    			}
    			System.out.println();
    		}
    		gap = (int) Math.floor(gap / 2);
    		if (gap >= 1) {
    			System.out.println("增量值:\t"+gap);
    		}
    	}
    }
执行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新鑫吖

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值