希尔排序是数据结构中必然要讲的一个算法,实质是直接插入排序算法的变种。
为什么取这个名字?
首先这个算法是由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;
}
}