希尔排序引论:
简单来说就是,希尔排序其实是一个特殊的直接插入排序,特殊之处在于为了降低时间复杂度,我们需要在调用直接插入排序之前,先想办法让它基本有序,而这个办法就是将相距某个增量的记录组成一个子序列,相当于多次调用直接插入排序,每一次的增量都保持互素,并且最后一个增量一定为1,为1才能保证其完全有序。
如果了解直接插入排序的话,希尔排序就是很容易理解的(前两次调用直接插入排序是为了让数列基本有序,最后一次和直接插入排序完全一致):
void Shell(int* ar, int n, int gap)
{
assert(ar != NULL);
if (ar == NULL)
{
return;
}
int tmp;
int j;
for (int i = gap; i < n; i++)
{
tmp = ar[i];
for (j = i - gap; j >= 0; j=j-gap)
{
if (ar[j] > tmp)
{
ar[j + gap] = ar[j];
}
else
{
break;
}
}
ar[j + gap] = tmp;
}
}
//希尔排序
void ShellSort(int* ar, int n)
{
assert(ar != NULL);
int gap[] = { 5,3,1 };
int lengap = sizeof(gap) / sizeof(gap[0]);
for (int i = 0; i < lengap; i++)
{
Shell(ar, n, gap[i]);
}
}
时间复杂度:O(n^1.3~n^1.5) 空间复杂度:O(1) 稳定性:不稳定