SOURCE

// 思路
// 外层循环记录当前值 里层循环以当前值前一位开始
// 从后往前遍历 遇到比当前值大的 就往后移一位
// 直到前面的已经排好序 比当前值小 又因为大的往后移了
// 中间就出现空缺 就将当前值插到此处

function fn(list) {
    // 从第二个元素开始遍历 默认前面的已排序
    for (let j = 1; j < list.length; j++) {
        let current = list[j] // 记录当前值
        let pre = j - 1 // 前一个元素索引
        //  将当前元素与已排序部分的元素比较 找到合适的位置插入
        while (pre >= 0 && list[pre] > current) {
            list[pre + 1] = list[pre] // pre位置的值往后移
            pre-- // 往前移
        }
        // 此时小于current的没动 大于current的都往后移了一位
        // 中间空了 将current插到此处
        // 注意 此时pre因为最后pre-- 在目标位置前一位
        list[pre + 1] = current
    }
}

// 验证
let list = [4, 3, 2, 10, 12, 1, 5, 6]
fn(list)
console.log('插入排序:' + list) // [1,2,3,4,5,6,10,12]
console 命令行工具 X clear

                    
>
console