插入类
直接插入排序¶
思路
- 将数组划分为两个部分,前面一部分是有序、后面一部分是无序
- 每趟将无序序列中的一个元素,插入到有序序列当中。插入过程中伴随着元素的移动
- 【评价】时间主要浪费在交换上
- 【适用】适合初始序列较有序的情况
- 【最坏】\(O(n^2)\)整个序列是逆序的
- 【最好】\(O(n)\)序列已经有序,需要比较n-1次,无需交换元素
- 【平均\(】\)O(n^2)
- 【空间】\(O(1)\)
- 【稳定性】稳定
折半插入排序¶
直接插入法的优化,在有序序列中采用,折半查找的方法,来定位每次的插入位置
- 【评价】比较次数与初始序列无光,每次都要折半,比较次数是一定的;而关键字移动次数与直接插入排序是一样的
- 【适用】适合关键字较多的场景
- 【最坏】\(O(n^2)\)
- 【最好】\(O(nlog_2n)\)
- 【平均】\(O(n^2)\)
- 【空间】\(O(1)\)
希尔排序¶
希尔排序,又名缩小增量排序。
【优化】用增量来划分子序列,在每个子序列中进行插入排序
【增量选取规则】
- 增量序列的最后一个值一定取1
- 增量序列中的值应尽量没有除1之外的公因子
【时间复杂度】与增量选取有关
- 每次将增量除以2并向下取整\(O(n^2)\)
- 增量\(2^k+1\)、65、33、17、9、5、3、1,即\(O(n^{1.5})\)
【空间】\(O(1)\)
【稳定性】不稳定