排序算法---插入排序(Insertion Sort)

117 阅读1分钟

算法核心

始终维护已经插入的元素处于排序状态,并不断插入新的元素

算法复杂度

排序算法空间复杂度稳定性复杂性
插入排序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);
  }
}