前端算法-插入排序

129 阅读1分钟

原理

取出一个值并插入到一个已有序的数组,插入后的数组依然保持有序

思路讲解

1、使用循环,将目标数组中的值依次取出,与有序数组中的值做比较

2、将当前取出的值,放到有序数组中的指定位置,使有序数组依然保持有序

3、最后循环完之后,将有序数组返回,即为结果

多种实现方式

这里我们将给出几个不同的实现方式,基本思想是一致的,只是实现的代码有所不同罢了

方案1

//方案一最简单,最容易理解,比较直观,也是笔者第一次按照原理写出来的方法
function insertSort (arr) {

    /**
     * 新建两个数组,
     * tempArr做数据变更
     * sortArr用来存储有序数组
     */
    let tempArr = []
    let sortArr = []

    /**
     * 进行循环遍历
     * 将满足条件的元素不断向 sortArr 中添加
     */
    for(let i = 0; i < arr.length; i++) {
        // mark 用于判断有序数组中是否有比目标值大的值,如果没有,则直接放到末尾
        let mark = false 
        // 每次循环,将改变的值赋值给有序数组
        sortArr = JSON.parse(JSON.stringify(tempArr))
        /**
         * 循环已有循环数组
         * 如果当前目标值小于有序数组中的某个值,则将目标值添加到有序数组中指定位置
         */
        for(let j = 0; j < sortArr.length; j++) {
            if(arr[i] < sortArr[j]) {
                // 将目标值添加到有序数组中的指定位置
                tempArr.splice(j, 0 ,arr[i])
                mark = true
                break;
            }
        }
        // 目标数最大,则直接放置到有序数组的末尾
        if(!mark) {
            tempArr.push(arr[i])
        }
    }
    return tempArr
}

方案2

方案2
主要思想就是交换满足条件的目标值,
与方案1不同的是,这里不再用数组来存储有序数组,
而是将数组中的目标值前面的部分作为有序数组

function insertSort(arr) {
    for(let i = 1; i < arr.length; i++) {
        for(let j = i; j > 0; j--) {
            if(arr[j] < arr[j - 1]) {
                let temp = arr[j]
                arr[j] = arr[j - 1]
                arr[j - 1] = temp
            }
        }
    }
    return arr
}

方案3

方案3
与方案2不同的是,这里将取最终的值进行赋值

function insertSort(arr) {

    let temp = null

    for (var i = 1; i < arr.length; i++){

        temp = arr[i]

        for (var j = i; j > 0 && temp < arr[j - 1]; j--){
            // 当前值和之前的每个值进行比较,发现有比当前值小的值就进行重新赋值
            arr[j] = arr[j - 1]
        }
        
        arr[j] = temp
    }

    return arr
}

结尾

插入排序思路简单,但是如果真的要理解并用代码实现,最好的方式大概就是用手动验算一次吧;

不同方案代码实现,有其不同思路

纸上得来终觉浅☺