Insertion Sort,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。
算法步骤
- 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
- 如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。
复杂度
| 标题 | 数据 |
|---|---|
| 平均时间复杂度 | O(n²) |
| 最好情况 | O(n) |
| 最坏情况 | O(n²) |
| 空间复杂度 | O(1) |
| 排序方式 | In-place |
| 稳定性 | 稳定 |
代码实现
function insertionSort(list) {
let len = list.length;
if (len <= 1) return list;
for (let i = 1; i < len; i++) {
let cur = i;
//从当前位置向前扫描,符合条件交换
while (cur > 0 && list[cur - 1] > list[cur]) {
[list[cur], list[cur - 1]] = [list[cur - 1], list[cur]]
cur--
}
}
return list
}