一、简介
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:稳定
- 优点:数据基本有序时,用它比较快;稳定;空间复杂度低,消耗内存少
- 缺点:时间复杂度高,执行效率差
二、核心思想
- 分成 有序部分 和 无序部分
- 无序部分中的元素插入到有序部分中合适的位置
- 两层循环
- 第一层由左往右遍历无序部分,插入到有序合适的位置,合适的位置由第二层循环决定
- 第二层从右往左遍历有序部分,与待插入元素比较,比插入元素大则向右移动
三、排序动图
红色:待插入元素
绿色:与待插入元素比较的有序元素
黄色:有序部分
蓝色:无序部分
四、代码实现
const insertSort = function (arr) {
// 待插入元素
let currentInsert;
// 有序下标
let orderIndex;
let length = arr.length;
// 遍历无序元素,将他们依次插入到有序部分的合适位置
for (let i = 1; i < length; i++) {
currentInsert = arr[i];
orderIndex = i - 1;
// 从右往左遍历,找到插入的合适位置, 并将比插入元素大的元素右移
while(orderIndex >= 0 && arr[orderIndex] > currentInsert) {
arr[orderIndex + 1] = arr[orderIndex];
orderIndex--;
}
// 插入元素
arr[orderIndex + 1] = currentInsert;
}
return arr;
}