插入排序
- 基本思想:将带排序表看作左右两个部分,左边为有序区,右边为无序区,排序的过程即将右边无序区中的元素逐个插入到左边的有序区,构成一个新的有序区
直接插入排序
算法步骤
- 设待排序的记录存储在数组
r[1……n]
中,将第一个记录r[1]
视作左边的有序序列,r[2……n]
视作右边的无序序列 - 依次将右边的无序序列中的第一个元素插入到有序序列中
复杂度
- 时间复杂度:
- 最好情况:本身有序->\(O(n)\)
- 最坏情况:本身逆序->\(O(n^2)\)
- 空间复杂度:\(O(1)\)
- 稳定性:稳定排序
最后一趟排序时,可能出现所有的元素都不在其最终位置上的情况
希尔排序
- 基本思想:将待排序列分为若干组,在每组内进行直接插入排序,使得整个序列基本有序,然后再对整个序列进行直接插入排序
- 分组的方式:间隔方法分组
- 设置步长\(d\),下标相差\(d\)的为一组
- 取值:\(d_1 = n / 2, d_2 = d_1 / 2……\)
算法步骤
- 记录待排序列
r[1……n]
,增量序列d[1……n]
- 依次按照所取得增量对每一组进行直接插入排序
复杂度
- 时间复杂度:
- 最好情况:\(O(n\log{n})\)
- 最坏情况:\(O(n^2)\)
- 空间复杂度:\(O(1)\)
- 稳定性:不稳定排序(分组中排序可能导致该不稳定性)