希尔排序

希尔排序

算法描述:

    希尔排序也叫“缩小增量排序”,是由shell创立,也是插入排序的一种变异。每次设置一定的步长,一般设置delta=Array.length/2,从0开始,组成[0,0+delta,0+delta+delta,...],[1,1+delta,1+delta+delta,...]等子序列,每组子序列进行插入排序,知道最后delta=1,完成一次插入排序即完成最终排序。

例如:
假如有初始数据:25  11  45  26  12  78。
  1、第一轮排序,将该数组分成 6/2=3 个数组序列,第1个数据和第4个数据为一对,第2个数据和第5个数据为一对,第3个数据和第6个数据为一对,每对数据进行比较排序,排序后顺序为:[25, 11, 45, 26, 12, 78]。
  2、第二轮排序 ,将上轮排序后的数组分成6/4=1个数组序列,此时逐个对数据比较,按照插入排序对该数组进行排序,排序后的顺序为:[11, 12, 25, 26, 45, 78]。

时间复杂度:最好的情况为O(n*lgn),最差复杂度O(n*n)
空间复杂度:O(1)
java实现:
public static void shellSort(int[] arr) {
		int delta = arr.length / 2; // 每一步步长为数组长度除以2,也有按其他步长的
		while (delta >= 1) {
			for (int i = 0; i < delta; i++) {// 每组起始位置
				for (int j = i + delta; j < arr.length; j += delta) {// 以下代码是插入排序的代码
					int target = arr[j];
					int k = j;
					while (k > 0 && arr[k - delta] > target) {
						arr[k] = arr[k - delta];
						k -= delta;
					}
					arr[k] = target;
				}
			}
			delta = delta / 2; // 每次除以2,最终到步长为1终止
		}
	}

github地址:https://github.com/xckNull/Algorithms-introduction.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值