写好最简单的希尔排序

希尔排序是数据结构中必然要讲的一个算法,实质是直接插入排序算法的变种。

为什么取这个名字?

首先这个算法是由DL.Shell于1959年发明,其次这个算法还有另外一个名字叫做缩小增量排序,这个名字更贴切,更直观,按照不同的增量,将序列中的元素分成若干组,然后每组元素进行直接插入排序。

算法的思想:

1:先取不同的增量序列d1>d2>…>dn,记住的是是d1<n,且dn=1,即最后一个元素是1

2:按照d1的大小,将序列中相隔为d1长度的序列划分成一组,然后对该组元素进行直接插入排序。

3:依照步骤2,对di重复进行上述过程

算法的复杂度:

希尔排序算法的复杂度目前数学上还没有求出来,但总体上来说要好于直接插入排序,比快速排序与归并排序要慢,目前也没有求出最佳的递减序列,之所以要比直接插入排序,是因为每次直接插入排序都是建立在上一次排序的基础上,因此减少了移动次数与比较次数。

算法的空间复杂度,空间很杂度为O(1),因为需要一个空间作为交换空间,或者当作哨兵

算法的稳定性:

因为并不是直接的插入排序,这种排序是建立在递减序序上,因些算法是不稳定的。

希尔排序算法的源代码:

//一个泛型的希尔排序算法 
template<class T>
void ShellSort(T *data,int dataNum, int *desc,int descNum)
{  
	int tmp;//生成一个临时的存储空间
	for(int i=0;i<descNum;i++)//递减序列
		for(int j=desc[i];j<dataNum;j+=desc[i])
		{   //保存data[j]
			tmp=data[j];
			//对组里面的元素做直接插入排序
			for(int t=j-desc[i];t>=0&&data[t]>tmp;t-=desc[i])
				data[t+desc[i]]=data[t];
			data[t+desc[i]]=tmp;
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值