算法核心
始终维护已经插入的元素处于排序状态,并不断插入新的元素
算法复杂度
| 排序算法 | 空间复杂度 | 稳定性 | 复杂性 |
|---|---|---|---|
| 插入排序 | O(1) | 稳定 | 简单 |
| 时间复杂度 | 复杂度 | 条件 |
|---|---|---|
| 时间复杂度(平均) | O(n^2^) | --- |
| 时间复杂度(最坏) | O(n^2^) | 初始数组逆序 |
| 时间复杂度(最好) | O(1) | 初始数组顺序 |
template <typename Comparable>
void insertionSort(vector<Comparable> & a)
{
//初始时插入第一个元素,处于排序状态
//从第二个元素开始插入
for (int p = 1; p < a.size(); ++p)
{
//待插入的元素 tmp
Comparable tmp = std::move(a[p]);
int j;
//从已排序状态的最后一个元素开始,比较并将比tmp大的元素向后移动
//类似于堆的维护
for ( j = p; j > 0 && tmp < a[j-1]; --j)
{
a[j] = std::move(a[j-1]);
}
//将tmp移动到的合适的空位
a[j] = std::move(tmp);
}
}