算法原理
谢尔排序( Shellsort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障的第一批算法之一,不过,直到它最初被发现的若干年后才证明了它的亚二次时间界。它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行距离减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,谢尔排序有时也叫作缩减增量排序(diminishing increment sort)
算法图解
template <typename T>
void shellSort(vector<T> & v)
{
for (int gap = v.size() / 2; gap > 0; gap/=2)
{
// 插入排序代码
for (int i = gap; i < v.size(); i++)
{
T tmp = v[i];
int j = i;
for (; j >= gap && v[j - gap] > tmp; j -= gap)
{
v[j] = v[j - gap];
}
v[j] = tmp;
}
}
}
时间复杂度
最好:O(n)
最坏:O(nlog2n)
平均:O(nlog2n)