希尔排序

希尔排序是对插入排序的一种改进,要想理解希尔排序必须先理解插入排序,希尔排序与插入排序的区别就是,希尔排序每次移动指针的距离不是固定每次只移动一个单位距离。可以想象一下,假设有一万个数据来排序,前9999个都已经排好了发现第10000个数据值相当小,如果它刚好是这个数据的最小值的话,他们它将会跟它前面的9999个数据依次的比较,然后再慢慢的移动,最后再排到第一个,这10000个数据还算少的,假如更多呢?计算机遇到这种情况,只能按照特定的算法愚蠢的执行,所以说插入法是一个不稳定的算法,而希尔排序就是对插入法的一种改进,是一个稳定的排序算法,希尔排序不要求一趟就把所有顺序都排好而是分很多趟完成的。它第一趟排序过程中指针一次移动的距离可以很大,然后到第二趟,第三趟....再慢慢缩短指针一次移动的距离,这样就可以保证,整个数列整体上是一个相对比较顺序的数列,只是局部顺序是乱的,这样就不会出现插入法那种到后面一个值要移动很远的距离的情况了。至于指针一次移动多少距离,是有一个固定的公式来计算的,代码如下:

public static void sort(int[] arr){
		int h=1;
		//初始化间隔,确定初始的移动距离
		while(h<arr.length/3){
			h=h*3+1;
		}
		while(h>=1){
			for(int i=h;i<arr.length;i++){
				int t=arr[i];
				int j=i-h;
				while(j>=h-1&&arr[j]>t){
					arr[j+h]=arr[j];
					j-=h;
				}
				arr[j+h]=t;
			}
			h=(h-1)/3;//每完成一趟排序,按照公式缩短移动距离
		}
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值