数据结构与算法篇-插入排序

插入排序

核心思路

统一视角:分治策略

  • 分:将数组划分为已排序部分和未排序部分;
  • 治:遍历未排序部分,解决单元素归位问题,增大已排序区间;

或者,更具体点:

  • 分:划分固定比例 1 : (n-1),即 [已排序 | 未排序];
  • 治:先解决单元素归位问题,再扩大已排序区间;
  • 性能:由于划分始终是线性 1 : n-1,路径深度为 n,故复杂度为 O(n^2);

核心逻辑:

  • 分:将数组划分为已排序部分和未排序部分;
  • 治:遍历未排序部分,将未排序部分的首元素插入到已排序部分的正确位置

状态变化追踪

初始

  • 已排序部分:[0, 0]
  • 未排序部分:[1, n-1]

第1轮(i=1)

操作:遍历未排序部分[1, n-1],将未排序部分的首元素插入到已排序部分的正确位置

结果

  • 已排序部分:[0, 1]
  • 未排序部分:[2, n-1]

第2轮(i=2)

操作:遍历未排序部分[2, n-1],将未排序部分的首元素插入到已排序部分的正确位置

结果

  • 已排序部分:[0, 2]
  • 未排序部分:[3, n-1]

第k轮(i=k)

操作:遍历未排序部分[k, n-1],将未排序部分的首元素插入到已排序部分的正确位置

结果

  • 已排序部分:[0, k]
  • 未排序部分:[k+1, n-1]

第n-1轮(i=n-1)

操作:遍历未排序部分[n-1, n-1],将未排序部分的首元素插入到已排序部分的正确位置

结果

  • 已排序部分:[0, n-1]
  • 未排序部分:[n, n-1],空集

算法结束后

结果

  • 已排序区间:[0, n-1]
  • 未排序区间:[n, n-1],空集

实现

性质

  • 稳定性?
  • 原地性?
  • 自适应性?
  • 在线性?
相关推荐
烛衔溟2 个月前
C语言算法:排序算法入门
c语言·算法·排序算法·插入排序·冒泡排序·选择排序·多关键字排序
perseveranceX2 个月前
插入排序:扑克牌式的排序算法!
c语言·数据结构·插入排序·时间复杂度·排序稳定性
_OP_CHEN3 个月前
数据结构(C语言篇):(十六)插入排序
c语言·数据结构·排序算法·学习笔记·插入排序·希尔排序·直接插入排序
梁辰兴4 个月前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
D_aniel_8 个月前
排序算法-插入排序
java·排序算法·插入排序
y.Ghost10 个月前
C语言实现的常见排序算法
c语言·数据结构·排序算法·插入排序·冒泡排序·选择排序·快速排序
星迹日1 年前
数据结构:排序—插入排序(一)
java·数据结构·算法·排序算法·插入排序·希尔排序
TPCloud1 年前
利用c语言详细介绍下插入排序
c语言·数据结构·排序算法·插入排序
Chensay.1 年前
排序算法(选择排序、直接插入排序、冒泡排序、二路归并排序)(C语言版)
c语言·算法·排序算法·插入排序·冒泡排序