希尔排序

希尔排序:

大概思路,排序时按照一个步进step来进行比较大小,交换顺序,如步进长度为13时,则从13开始,与0进行比较,若比0小则与0交换位置。

继续从14开始,14则与1进行比较,若小于1则与1交换位置。当进行到26时,26会与13进行比较,若比13小,则与13交换位置,然后再与0比较,若比0小,再交换位置。

依次类推,知道循环至n - 1.


一次步进结束后,将步进减小,在书上看到的步进step的得出公式是 step = step*3  + 1(ste从0开始)\。

比如一个100个元素的数组,它的n是从40开始的。次位是13,13*3 + 1 < 100。故可以从40的步进开始。

每次一次步进结束后,step = (step-1)/ 3。


    public void sort() {
		int temp = 0;// 用来保存某次要交换的数据
		int outer = 0;// 外层for循环,控制遍历整个数组
		int inner = 0;// 内存循环,控制遍历当前元素往后的一个步进单位,二个步进单位...
		int step = 0;// 步进
		int length = param.length;
		while (step < length) {// 给步进设置初始值
			step = step * 3 + 1;
		}
		while (step > 0) {
			for (outer = step; outer < length; outer++) {
				temp = param[outer];
				inner = outer;
				while (inner - step >= 0 && param[inner - step] >= temp) {
					param[inner] = param[inner - step];
					inner -= step;
				}
				param[inner] = temp;
			}
			step = (step - 1) / 3;
		}
	}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值