插入排序
核心思想
插入排序就像整理手牌一样,每次拿到一张新牌,就把它插入到前面已经排好序的牌堆中合适的位置。假设下标范围 [0, end] 区间是有序的,tmp 为要插入的数据值(即 end + 1 位置的值)。将 end 对应的值与 tmp 比较,若 tmp 更小则前移,否则停止。
代码实现
void InsertSort(int* a, int n)
{
for (int i = 0; i < n - 1; i++)
{
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
希尔排序
核心思想
希尔排序是插入排序的改进版本。它通过设定一个间隔 gap,将数组分成若干组进行预排序,让数组整体逐渐接近有序,最后当 gap 为 1 时执行一次标准插入排序收尾。
实现思路
- 分组:根据
gap值将相距gap的元素视为一组。 - 预排序:对每组分别进行插入排序。
- Gap 取值:通常采用
gap = gap / 3 + 1的策略递减,确保最后一次gap为 1。
代码实现
void ShellSort(int* a, int n)
{
int gap = n;
while (gap > 1)
{
gap = gap / 3 + 1;
( i = ; i < n - gap; i++)
{
end = i;
tmp = a[end + gap];
(end >= )
{
(tmp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
{
;
}
}
a[end + gap] = tmp;
}
}
}


