希尔排序是插入排序的进阶版本,他多次调用插入排序,在插入排序上进行了改造,使其处理无序的数据时候更快
核心思想:1.分组 2.直接插入排序:越有序越快
算法思想:
间隔式分组,利用直接插入排序让组内有序,然后缩小分组再次排序,直到组数为1,;理论基础为直接插入排序
高明之处:
我们正常分组时候是这样直接挨着分组,每3个3个分组,这样导致我们分组之后,小的数字变化不大,大的数字变化也不大,而我们希望小的数字在前面,大的数字在后面,这样可以减少我们的时间复杂度;
而我们通过这样的间隔式分组,可以实现,尽量让大数据在后面,肖书记在前面,通过5 3 1的三次分组,(注:最后一次必须是1的分组,因为我们要让所有数据有序)实现比插入排序时间复杂度低的排序
代码实现:
//一趟希尔排序
static void Shell(int* arr, int len,int gap)//gap为组数或者(间隔)
{
int tmp, i, j;
for (i = gap; i < len; i+=gap)
{
tmp = arr[i];
for (j = i - gap; j >= 0; j-=gap)
{
if (arr[j] > tmp)
{
arr[j + gap] = arr[j];
}
else
break;
}
arr[j + gap] = tmp;
}
}
void ShellSort(int* arr, int len)
{
int drr[] = { 5,3,1 };
for (int i = 0; i < sizeof(drr) / sizeof(drr[0]); i++)
{
Shell(arr, len, drr[i]);
}
}
特点:
希尔排序时间复杂度O(n^1.3~n^1.5),空间复杂度O(1),不稳定