算法复习--shell排序

算法基本思想:首先取一个小余数组长度的一半或一半以下的步长d,然后通过让数组里下标是d的倍数的元素取出来分成一组,然后把每个组了选出来的元素进行插入排序,一轮结束后,把d的值减半,再次排序,直到d=1。


	static int[] ShellAlg(int[] R){
		int i =0,j=0,t=0;
		int n = R.length;
		int d = n/2;
		//第一层循环控制步长
		for(;d>0;d=d/2){
			//第二层循环控制从数组中取出d的倍数下标的元素
			for(i=d;i<n;i++){
				t=R[i];
				//第三层循环控制比较并进行数据移动
				for(j=i-d;j>=0;j-=d){
					if(t<R[j]){
						R[j+d]=R[j];
					}
					else break;
				}
				//每次比完一轮以后,找到被比较元素的位置
				R[j+d]=t;
			}
		}
		return R;
	}

时间复杂度

最好情况:由于希尔排序的好坏和步长d的选择有很多关系,因此,目前还没有得出最好的步长如何选择(现在有些比较好的选择了,但不确定是否是最好的)。所以,不知道最好的情况下的算法时间复杂度。  
最坏情况下:O(N*logN),最坏的情况下和平均情况下差不多。  
平均情况下:O(N*logN)

空间复杂度:没有用其他额外的空间O(1)

稳定性:不稳定。因为每轮都要移动元素,相同的元素通常不会在一轮排序中并插入排序,很有可能被移动,因此是不稳定的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值