博客主页: 爱吃bug的猿
博客专栏: 数据结构,C语言初阶进阶全流程讲解
如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新
- 希尔排序里的一部分和插入排序极其相似,了解插入排序及其复杂度(动图讲解)可点击此处
- 希尔排序分为两部分:预排序+插入排序
4. gap==2排序结果为
5. 最后gap == 1,插入排序即可
6. 目前gap的取法很多gap = gap/3 + 1(这里+1,是为了保证gap的最后的结果可以是1),gap = gap/2
void ShellSort(int*a,int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
//间隔为gap的元素分为一组,总计gap组,gap每次减小,直至gap == 1
for (int j = 0; j < gap; j++)
{//选出gap组的其中一组
for (int i = j; i < n - gap; i += gap)
{//对gap组的其中一组进行排序
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
}
void ShellSort(int* a, int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
//间隔为gap的元素分为一组,总计gap组,gap每次减小,直至gap == 1
for (int j = 0; j < gap; j++)
{//选出gap组的其中一组
int tmp = 0;
for (int i = j; i < n - gap; i += gap)
{//对gap组的其中一组进行排序
int end = i;
while (end >= 0)
{
if (a[end] > a[end + gap])
{
int tmp = a[end + gap];
a[end + gap] = a[end];
a[end] = tmp;
end -= gap;
}
else
{
break;
}
}
}
}
}
}
void ShellSort(int*a,int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
for (int i = 0; i < n - gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > a[end + gap])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
a[end + gap] = tmp;
}
}
}
}
- 希尔排序的时间复杂度其实是算不出准确数值的,但我们能探讨一下到底是因为什么才算不出来
每组插入(次数):1+2+3+…+( n / gap) - 1
总的插入次数:gap(1+2+3+…+(n / gap) - 1)
假设gap = gap / 3(gap = gap /3 + 1,1忽略点)
则gap = n/3
gap = n /9
gap = n / 27
将gap带入也是可以算的,但是随着gap的减小,数组前面的数组逐渐有序,它不是总是最坏情况下的(上面算的最坏情况下的),当gap为1时,如果还是最坏情况下计算的话,那么总插入次数为1+2+3+…+n - 1 约等于N^2,结果显然不是这样的
所以最后估计结果O(n^1.3)