希尔排序思想:
将现有数据分为d个组,在每个分组内使用直接插入排序算法,使得整个数据段越来越有序。
接着继续将数据分组并使用直接插入排序(分组会越来越小),直到分组为1。(每个分组数一般互质)
时间复杂度: O(n^1.3–1.5)
空间复杂度: O(1)
稳定性: 不稳定
void Shell(int* arr, int len, int group)
{
int tmp = 0;
for (int* p = arr + group; p < arr + len; p++)
{
tmp = *p;
for (int* q = p - group; q >= arr; q -= group)
{
if (*q <= tmp)
{
*(q + group) = tmp;
break;
}
*(q + group) = *q;
if (q == arr) *q = tmp;
}
}
}
void ShellSort(int* arr, int len)
{
int group[] = { 5,3,1 };
for (int i = 0; i < sizeof(group) / sizeof(group[0]); i++)
{
Shell(arr, len, *(group + i));
}
}
排序结果: