希尔排序 (Shell Sort)
希尔排序(Shell Sort)是一种改进的插入排序算法,它的基本思想是通过将待排序列表分割成若干个子列表,对每个子列表进行插入排序,然后逐步缩小子列表的间隔,直到间隔为1,最终完成整个列表的排序。
希尔排序的步骤如下:
- 选择一个间隔序列(Increment Sequence),即一系列增量值(例如,[n/2, n/4, n/8, ..., 1]),其中 n 是列表的长度。
- 根据选择的增量值,将列表分割成若干个子列表,每个子列表包含间隔值指定的元素。
- 对每个子列表分别进行插入排序,即将子列表中的元素按照插入排序的方式进行排序。
- 重复以上步骤,逐步缩小增量值,直到增量值为1,完成最后一次插入排序,此时整个列表已经有序。
- 时间复杂度取决于所选择的增量序列,最坏情况下的时间复杂度为 O(n^2),但是对于大多数增量序列,希尔排序的时间复杂度通常在 O(n^1.3) 左右。
接下来我们给出示例代码
c
void shell_sort(int *array, int array_num)
{
int group;
int i;
int j;
int cur_data;
printf("shell sort\n");
for (group=array_num/2; group>0; group=group/2)
{
for (i = group; i < array_num; i++)
{
j = i;
cur_data = array[i];
while ( j-group>=0 && cur_data<array[j-group] )
{
array[j] = array[j - group];
j = j - group;
}
array[j] = cur_data;
}
}
}