插入排序
插入排序, 也被称为直接插入排序. 每一步将一个待排序的数据插入到之前已经排好序的序列中, 并保持依然有序, 直到插完所有数据
void InsertSort(int* a, int n)
{
for (int i = 0; i < n - 1; ++i)
{
// 在有序区间[0, end]中插入num
int end = i;
int num = a[end + 1];
while (end >= 0)
{
if (a[end] > num)
{
a[end + 1] = a[end];
--end;
}
else
{
break;
}
}
a[end + 1] = num;
}
}
希尔排序
希尔排序又称缩小增量排序, 是插入排序的一种变形, 效率更优. 基本思想是: 把待排序数据按下标的一定增量分组, 对每组使用直接插入排序算法排序; 随着增量逐渐减少, 每组包含的关键词越来越多, 当增量减至1时, 整个序列恰好被分成一组, 算法结束
void ShellSort(int* a, int n)
{
// 当gap>1时为预排序,目的是让数组更接近于有序状态
// 当gap=1时数组已经接近有序了,此时插入排序更快
int gap = n;
while (gap > 1)
{
// 间隔为gap的预排序
gap = gap / 3 + 1; // +1是为了保证最后一次增量一定是1
for (int i = 0; i < n - gap; ++i)
{
int end = i;
int num = a[end + gap];
while (end >= 0)
{
if (a[end] > num)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = num;
}
}
}