排序算法之直接插入排序
这里是传送门⇒总结:关于排序算法
平均时间复杂度 | 最优时间复杂度 | 最差时间复杂度 | 空间复杂度 | 稳定性 | |
---|---|---|---|---|---|
直接插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
- 算法描述
- 依次将值插入到已经排好序的区间中它应该待的位置,从而使有序区间长度依次+1
- 寻找某个值在有序区间的位置采用的是让其与有序区间中的元素比较大小并不断把已排序好的元素向后移的方式
- 寻找位置这个操作应该是从第二位数字开始的,因为一开始有序区间为空,第一位数字就直接放进去了,不需要寻找位置
- JS实现
// 此处传入的array会被直接改变
function InsertionSort(array) {
var len = array.length;
for (var i = 1; i < len; i++) {
var temp = array[i];
for (var j = i; j > 0 && temp < array[j - 1]; j--) {
array[j] = array[j - 1];
}
array[j] = temp;
}
}
- 分析
- 任何情况下都是两层循环,时间复杂度T(n) = O(n2)
- 该排序属于原地排序,空间复杂度S(n) = O(1)
- 因为是只有小于前面的数才会往后移,即遇到相等的数字不会让其后移,所以直接插入排序是稳定的
- 优化
- 增加一个哨兵位,可以让寻找某个值在有序区间的位置这个过程中不需担心数组下标越界问题,即少了“j>0”这一步,但需要在待排序列中为哨兵位空出第一个位置