希尔排序的体会

           希尔排序属于插入排序的一种,每次设定一个步长dk,则把原数组分为dk个分数组:

       A1[0,dk,2dk,3dk,4dk,...].

       A2[1,dk+1,2dk+1,3dk+1,4dk+1,...]

       A3[2,dk+2,2dk+2,3dk+2,4dk+2,...]

       。。。。。。

       每个分数组分别进行直接插入排序。

       然后将dk的值逐渐减小,再进行如上排序。直到减小到1时,原数组最后进行的就是一次直接插入排序。这样数组就排好序了。

       dk的初始值一般为原数组A的长度len的一半,为dk=len/2;

       dk的结尾值为1;每一次dk/=2; 呈指数型减小。

问题:

       为何要进行dk>1时的哪些排序?直接dk=1,直接插入排序不就完事了吗。

答:

      插入排序的时间复杂度是与数组的状态有关的。进行了dk>1的那些排序后,会大大减小dk=1时的排序。当n处于某个特定范围内时,希尔排序的时间复杂度为O(n^1.3).在最坏情况下,希尔排序的时间复杂度为O(n*n).

     

void ShellSort(int A[], int n){
	int dk;
	for(dk=n/2;dk>=1;dk/=2){//dk在呈指数性减小。
		for(int i=dk;i<n;i++){
			if(A[i]<A[i-dk]){
				int temp=A[i];
				int j;
				for(j=i-dk;j>=0;j-=dk){
					if(temp<A[j])
						A[j+dk]=A[j];
					else
						break;
				}
				A[j+dk]=temp;
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值