排序思路
希尔排序是一种分组插入方法。先取一个小于元素个数n的正整数d,将元素分成d组,依次对每组内部进行直接插入排序,完成一趟后,再取一个小于d的增量,重复以上步骤,直到增量为1时进行最后一趟排序,此时元素基本正序。
实现
void shell_sort(RecType R[], int n)
{
int i, j, d;
RecType tmp;
d = n/2;
while (n > 0)
{
for (i=d; i<n; i++)
{
tmp = R[i];
j = i-d;
while (j>=0 && tmp.key < R[j].key)
{
R[j-d] = R[j];
j -= d;
}
R[j+d] = tmp;
}
d /= 2;
}
}
算法分析
时间复杂度分析
平均时间复杂度:因为希尔排序的时间复杂度难以分析,而经研究一般认为是:
O
(
n
1.3
)
O(n^{1.3})
O(n1.3)
希尔排序在效率上比直接插入排序有很大的改善,原因有2:
- 当增量较小时,直接插入排序的最好和最坏时间复杂度差别不大,而希尔排序就是从增量很小开始的。
- 当增量逐渐增大时,数据逐渐趋于有序,当增量为1时,希尔排序对数据序列进行一趟直接插入排序,而此时数据序列基本正序。
空间复杂度
O ( 1 ) O(1) O(1)
稳定性
不稳定