目录
直接插入排序是一种简单直观的排序算法,其思想是通过构建已排序部分和未排序部分,将待排序元素按照大小逐个插入到已排序部分的正确位置中,完成排序。
具体步骤如下:
时空复杂度:
稳定性:
直接插入排序是稳定的,即相等元素的相对次序在排序前后保持不变。当比较相等元素时,由于只有当前元素小于等于已排序部分的某个元素时才插入,因此相等元素的相对次序不会发生改变。
需要注意的是,尽管直接插入排序在最坏情况下的时间复杂度较高,但对于小规模或基本有序的序列,直接插入排序的性能较为优秀。
void InsertSort(int* a, int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
temp = a[i + 1]; // 将当前待插入的元素暂存到变量temp中
j = i; // j用于记录已排序部分的最后一个元素的索引
while (j >= 0)
{
if (temp < a[j])
{
a[j + 1] = a[j]; // 如果temp比已排序部分的元素小,将该元素后移一位
}
else
{
break; // 如果temp不小于已排序部分的元素,跳出循环
}
j--; // 继续向前比较
}
a[j + 1] = temp; // 将暂存的元素插入到正确位置
}
}
希尔排序是基于插入排序的一种改进算法,也称为缩小增量排序。它通过将待排序序列按照一定间隔分成多个子序列,并对每个子序列进行插入排序的方式来逐步减小间隔,最终使整个序列有序。
具体步骤如下:
希尔排序的思想是利用了插入排序对基本有序的序列性能较好的特点,通过提前部分排序减少了逆序对的数量,从而提高了排序效率。
时空复杂度:
稳定性:
希尔排序是不稳定的,因为在每个子序列中进行插入排序时,相等元素的相对次序可能会发生改变。
void ShellSort(int* a, int n)
{
int gap = n; // 设置初始的增量gap为序列长度
int temp, i, j;
while (gap > 1)
{
gap = gap / 2; // 缩小增量
for (i = 0; i < n - gap; i++)
{
temp = a[i + gap]; // 将当前待插入的元素暂存到变量temp中
j = i;
while (j >= 0)
{
if (temp < a[j])
{
a[j + gap] = a[j]; // 如果temp比已排序部分的元素小,将该元素后移gap位
j -= gap; // 向前移动gap位
}
else
{
break; // 如果temp不小于已排序部分的元素,跳出循环
}
}
a[j + gap] = temp; // 将暂存的元素插入到正确位置
}
}
}