算法思想:
采用分组的思想,把一组数字分为若干的小组,而在分组的过程当中,并不是几个几个紧挨着的分组,而是采用特定的
分组方式,每一次都让组内有序(),这样排序的好处是,每次排序都是将小的数据尽量往前赶,大的数据尽量往后
赶。在这里面,每一组的数字个数,在每一次分组的时候,都会缩小增量,比如第一次分组每组 3 个,第二次每组 5 个,
第三次每组 1 个这样去分。(最后一次就直接进行一次插入排序,优点在于,如果不执行前面的分组过程的话,数据的
移动次数更多,更复杂,经过排序之后,数据已经越来越有序了。利用直接插入排序特性)
总而言之 就是分组思想 组内直接插入排序 最后必须一个为一组
好的增量序列的共同特征:
1、 最后一个增量必须为 1;
2、应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况
时间复杂度:一般认为 O(n^1.3)到 O(n^1.5)之间
最坏时间复杂度 O(n^2)
最好时间复杂度 O(n)
空间复杂度:O(1)
稳定性:不稳定
void Shell(int *arr, int len, int gap)
{
for (int i = gap; i < len; i++)
{
int tmp = arr[i];
int j = i-gap;
for (j; j >= 0; j=j-gap)
{
if (tmp < arr[j])
{
arr[j + gap] = arr[j];
}
else
{
break;
}
}
arr[j + gap] = tmp;
}
}
void ShellSort(int *arr, int len)
{
int drr[] = { 5,3,1 };//增量按情况而定,最后一组必须为1
int len_drr = sizeof(drr) / sizeof(drr[0]);
for (int i = 0; i < len_drr; i++)
{
Shell(arr, len, drr[i]);
}
}