- 算法思想:将待排序的序列分割为若干如 i,i+d, i+2d... , i+kd的特殊的子表,然后对各个子表进行插入排序。然后缩小d的值,一般取d = d / 2,知道d的值为1。
- 空间复杂度:O(1)
- 时间复杂度:未知,相对直接插入排序性能较好
- 不稳定
- 仅可用于顺序表
#include<stdio.h>
#include<stdlib.h>
//希尔排序(插入排序的基础之上)
void shellSort(int arr[], int len)
{
int i, d, j, temp;
for (d = len / 2; d >= 1; d /= 2)//步长变化
{
for (i = d; i < len; i += d)
{
if (arr[i - d] > arr[i])//将arr[i]插入有序增量子表
{
temp = arr[i];//暂存在temp中
for (j = i - d; j >= 0 && arr[j] > temp; j--)
{
arr[j + d] = arr[j];//记录后移,查找插入的位置
}
arr[j + d] = temp;//插入
}
}
}
}
void test()
{
int arr[] = { 4,63,7,3,2,9,8 };
int len = sizeof(arr) / sizeof(int);
shellSort2(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d,", arr[i]);
}
}
void main()
{
test();
}