将数组分为已排序和未排序两部分,每次从未排序的部分取出一个元素刺进到已排序部分的适当方位。

稳定性
根据查入的方位,刺进排序在排序的过程中,始终保持元素的在整体元素中的相对方位不变,所以是稳定的排序算法

时刻复杂度

  • 在最好的情况下,即是数组自身有序的情况下,只需要遍历一遍即可,这时候的时刻复杂度取决于元素个数,为:O(n)。

  • 在最坏的情况下,内外都要循环一次,所以这时候时刻复杂度为O(n)。

  • 平均时刻复杂度为:O(n)

/// 刺进排序
insertionSort(List<int> src) {
  for (int i = 1; i < src.length; i++) {
    int temp = src[i]; // 将当时元素存储到临时变量 temp 中
    int j = i - 1; // j 表示已排序部分的最后一个元素的索引
    // 在已排序部分从后往前查找,找到适宜方位刺进当时元素
    while (j >= 0 && temp < src[j]) {
      src[j + 1] = src[j]; // 当时元素比已排序部分的元素小,将元素后移一位
      --j; // 向前遍历
      // 更新排序结果回调
    }
    src[j + 1] = temp; // 刺进当时元素到已排序部分的正确方位
    print("第 $i 轮刺进");
  }
  print("刺进排序, src:$src n");
}
void main() {
  insertionSort([36, 3, 4, 2, 1, 6, 5, 9, 7, 8, 10]);
}

参考资料

Python 数据结构与算法详解