希尔排序是插入排序的一种高效改进版本,也称为"缩小增量排序"。它通过将原始数组分成多个子序列来提高插入排序的效率。
算法思想
希尔排序的基本思想是:
-
将数组按照一定的间隔(gap)分成若干子序列
-
对每个子序列进行插入排序
-
逐渐缩小间隔,重复上述过程
-
当间隔为1时,进行最后一次插入排序,此时数组已经基本有序,插入排序效率很高
代码:
void ShellSort(int* num, int n)
{
int gap = n; // 初始化间隔为数组长度
while (gap > 1) // 当间隔大于1时继续排序
{
// 计算新的间隔
gap = gap / 3 + 1;
// 对每个子序列进行插入排序
for (int i = 0; i < n - gap; i++)
{
int end = i;
int temp = num[end + gap]; // 保存当前待插入元素
// 插入排序过程
while (end >= 0)
{
if (num[end] > temp) // 如果前一个元素大于待插入元素
{
num[end + gap] = num[end]; // 向后移动元素
end -= gap; // 向前比较
}
else
{
break; // 找到合适位置,退出循环
}
}
num[end + gap] = temp; // 插入元素到正确位置
}
}
}
详细步骤说明
-
初始化间隔(gap):
-
初始间隔设为数组长度n
-
使用
gap = gap / 3 + 1
来计算新的间隔,这是一种常见的间隔序列计算方式
-
-
外层循环:
-
当gap > 1时继续排序
-
每次循环后gap会缩小,直到最后gap=1
-
-
中间层循环:
-
for (int i = 0; i < n - gap; i++)
控制每次处理的起始位置 -
这个循环实际上是对各个子序列进行交替处理,而不是完整处理一个子序列后再处理下一个
-
-
内层循环(插入排序):
-
保存当前元素
num[end + gap]
到temp -
将temp与前面间隔gap的元素比较
-
如果前面的元素更大,则向后移动
-
直到找到合适的位置插入temp
-