算法复习--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)

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


猜你喜欢

转载自blog.csdn.net/Diaoliangwang/article/details/38471459