直接插入排序

570 阅读2分钟

插入排序的基本思路就是向有序序列中 插入一个元素 从而得到新的长度+1的有序序列,那个整理扑克牌的比喻,就不说了,因为我觉得理麻将更像 ,麻将整体后移更明显,在插入一张新牌的时候。 对于一个有序序列,有一个新元素要加入,加入之后还要保证其有序性,那么在新元素加入之前,新元素的位置就已经确定了。插入排序就是 找到这个位置 完成插入。
js的数组方法里刚好有这么一个方法splice(i,0,item), 用于向索引为i的位置插入元素,之前的第i个元素及后面的元素 往后挪。
好了,上代码。

// 先来个简单的 建立一个有序的辅助数组,不停的把原数组的元素插入到有序数组中
function insert(arr = []) {
    const rs = [arr.pop()];
    while (arr.length) {
        const el = arr.pop();
        // res是个递增序列 遇到比末尾还大的只能放后面
        if (rs[rs.length - 1] <= el) {
            rs.push(el)
            continue
        }
        for (let i = 0; i < rs.length; i++) {
            if (rs[i] > el) {
        // 这里的res已经是个递增序列了 遇到比自己小的肯定放前面      
                rs.splice(i, 0, el)
                break;// 找到自己的位置了 结束
            }
        }

    }
    return rs
}



// 不使用额外的数组 实现splice的插入
function insert2(arr) {
    for (let i = 1; i < arr.length; i++) {
        // 这样要先记住第i个元素
        let t = arr[i]
        // 内循环倒着 遍历有序的部分
        for (let j = i - 1; j >= 0; j--) {
            // 这里不使用splice就有点像冒泡排序了,不过前面的部分已经有序 只需先记住 最后一个 实现整体后移,不需要挨个交换
            if (t < arr[j]) {// 小 t就要往前移 对应元素后移
                arr[j + 1] = arr[j]
            } else { //大就放后面 
                arr[j + 1] = t
                break; //找到位置了 结束
            }
        }
        // 走过了这个循环并且 这个值比第一个还小 那么还需要补上一个判断
        if(arr[0] > t){
            arr[0] = t
        }
    }
}

其实插入排序号还可以理解为建立 一个有序数组 并且去维护它, 删除不用说 删除不影响有序性, 添加就是插入这种方式。之所以这么简单的排序还单独写一篇 ,是因为我之前没接触过,然后从我接触到理解居然花了三天,要是有人用js的splice跟我讲 我可能一下就明白了, 果然人与人之间是不同的