递归之希尔排序

希尔排序

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

思路

如序列:9 8 7 6 5 4 3 2 1

  • 确定一个增量序列,如4(length/2) 、2 、1 ,从大到小使用增量
  • 使用第一个增量,将序列划分为若干个子序列,下标组合为0-4-8, 1-5, 2-6,3-7
  • 依次对子序列使用直接插入排序法;
  • 使用第二个增量,将序列划分为若干个子序列(8-2-4-6-8),(1-3-5-7)
  • 依次对子序列使用直接插入排序法:
  • 使用第三个增量1,这时子序列就是元序列(0-1-2-3-4-5-6-7-8) ,使用直接插入法
  • 完成排序。

时间复杂度:不太确定在0 (nlogn) ~0 (n2)之间
空间复杂度: 0(1)
原址排序
稳定性:由于相同的元素可能会被划分至不同子序列单独排序,因此稳定性是无法保证的——不稳定
代码:

//希尔排序
	public static void shellSort(int[] arr) {
		//外层循环:确定增量,内层循环:判断各个组
		for(int i = arr.length / 2; i > 0; i /= 2) {
			for(int j = i; j < arr.length; j++) {
				int target = arr[j];
				int k = j - i;
				while(k > -1 && target < arr[k]) {
					arr[k + i] = arr[k];
					k -= i;
				}
				arr[k + i] = target;
			}
		}
	}
	//插入排序
	public static void sort(int[] arr) {
		for(int i = 1 ; i < arr.length; i++) {
			int target = arr[i];
			int j = i - 1;
			while(j > -1 && target < arr[j]) {
				arr[j + 1] = arr[j];
				j--;
			}
			arr[j + 1] = target;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值