1.算法原理
希尔排序:先将待排序表分割成若干形如L[i,i+d,i+2d,…,i+kd]的“特殊”子表,对各子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。
2.具体算法
//第一部分:排序算法
//9-4 希尔排序
//2020.09.23
//先追求表中元素部分有序,再逐渐逼近全局有序
void ShallSort(int A[],int n)
{
int d,i,j;
for(d=n/2;d>=1;d/=2)//步长变化
for(i=d+1;i<n;i++)
if(A[i]<A[i-d])//需将A[i]插入到有增量的子表中
{
A[0]=A[i];//暂存在A[0]
for(j=i-d;j>0&&A[j]>A[0];j-=d)
A[j+d]=A[j];//记录向后移位,找到直接插入的位置
A[j+d]=A[0];//插入
}
}
3.算法性能分析
空间复杂度:O(1)
时间复杂度:未知,但优于直接插入排序
稳定性:不稳定
适用性;仅适用顺序表