排序算法之插入排序

114 阅读2分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

插入排序

  • 插入排序:每次排一个数组项,以此方式构建最后的排序数组。
  • 实现思路:假定第一项已经排序了,接着,拿它和第二项进行比较,以此来确定,第二项是应该待在原位还是插到第一项之前。这样的话,我们前两项就已经正确排序,接着和第三项进行比较(确定它是该插入到第一、第二还是第三的位置),以此类推。

实现

function insertSort(arr) {
    // 声明需要用到的变量
    let len = arr.length;
    let j = null;
    let temp = null;
    // 遍历要排序的数组,按照我们上边的实现思路:
    for (let i = 1; i < len; i++) {
        // 先假设第一项已经排好顺序了,此时待排序的项就是数组的第二项,也就是下标为1的项,(这就是我们i从1开始循环的原因),同时我们将待排序的值缓存到temp临时变量中,方便我们后续将其插入到正确的位置
        j = i;
        temp = arr[i];
        // 只要j大于0(数组索引最小为0)且数组中前一项的值比待比较的值大,那么我们就将这个值移动到当前位置上,并且减小 j
        while (j > 0 && arr[j - 1] > temp) {
            arr[j] = arr[j-1]
            j--
        }
        // 最终将 temp 插入到 正确的位置
        arr[j] = temp
    }
}

解析

  • 比方说 待排序数组是[3, 5, 1, 4, 2]
  1. 首先假定 3 已经排序,从数组的第二项 5 开始遍历,3比5小,所以 3 待在原位。
  2. 接着 i 变为了 2,将其赋值给j,即此时要比较的是 数组的5 和 1,5比1大,所有两者调换位置,将 j 减 1,此时进行 3和1比较,3比1大,两者调换位置,j减 1,此时j等于0了,跳出while循环, 将待排序的temp(即此时的1),放到了数组下标为j的位置,即此时的第0位。到此数组的暂时顺序是[1, 3, 5, 4, 2]
  3. 然后再次循环数组,此时i为 3,根据上述的步骤得出此轮结束之后的数组为 [1, 3, 4, 5, 2]
  4. 接着是 i 为 4,得出的数组为 [1, 2, 3, 4, 5],至此数组排序完成。