美文网首页
数组排序算法 — 插入排序

数组排序算法 — 插入排序

作者: pansly | 来源:发表于2019-09-19 15:32 被阅读0次

对于经典算法,你是否也遇到这样的情形:学时觉得很清楚,可过阵子就忘了?

本系列文章就尝试解决这个问题。

研读那些排序算法,细品它们的名字,其实都很贴切。

比如插入排序,所谓“插入”,实指把待排序元素插入到已排好的序列里。

上图演示了第4次遍历,此时元素1、3、5已经是有序序列,待排的元素是2,要把它插入到1和3之间。此时3和5都往后移动了一位。

可以看出该算法的核心是:如何在有序序列里找到正确的插入位置?

思路是从有序序列的尾部开始,逐个与目标元素比较,如果大于目标元素,该元素需要后移。

可以看出之所以先要缓存一下目标,是为了要把它的位置先空下来,方便其他元素移入。 另外,当元素不大于目标时,此时说明要插入目标的位置已经找到了。

翻译成代码:

let array = [1, 3, 5, 2, 4]
let i = 3
let target = array[3]
while(i > 0 && array[i-1] > target) {
  array[i] = array[i-1]
  i--
}
array[i] = target
console.log(array) // [ 1, 2, 3, 5, 4 ]
复制代码

能插入成功一个,遍历n-1次(第一个元素本身就是有序序列了),就可以全部插入,代码很容易写出来:

for (let j = 1; j < array.length; j++) {
  let i = j
  let target = array[i]
  while(i > 0 && array[i-1] > target) {
    array[i] = array[i-1]
    i--
  }
  array[i] = target
}
复制代码

完整代码:

const utils = {
  swap(array, a, b) {
    [array[a], array[b]] = [array[b], array[a]]
  },
  randomNum() {
    return Math.floor(Math.random() * 100)
  },
  randomArray() {
    return Array.from(Array(this.randomNum()), _ => this.randomNum())
  }
}

function insertionSort(array) {
  for (let i = 1; i < array.length; i++) {
    let j = i
    let target = array[j]
    while(j > 0 && array[j-1] > target) {
      array[j] = array[j-1]
      j--
    }
    array[j] = target
  }
  return array
}
let array = utils.randomArray()
console.log(insertionSort(array))

至此,插入排序原理和实现已经说完了。

相关文章

  • JavaScript的排序算法——插入排序

    插入排序(Insertion Sort) 插入排序是一种简单的排序算法,这种算法可以一次构建最终排序的数组(或数列...

  • 排序算法

    常见的排序算法 常见的排序算法有:插入、希尔、选择、冒泡、归并、快速、堆排序。。。 插入排序 算法步骤一、从数组的...

  • 看动画学算法之:排序-插入排序

    简介 插入排序就是将要排序的元素插入到已经排序的数组中,从而形成一个新的排好序的数组。 这个算法就叫做插入排序。 ...

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

  • JavaScript实现排序算法

    排序算法主要用于元素的数组排序,常见的排序算法有冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序等,这些...

  • 2020前端面试(数据结构)

    常见排序算法 冒泡排序 快速排序 选择排序 插入排序 数组扁平化 递归 reduce toString 树的遍历 ...

  • 插入排序及优化 && 冒泡排序及优化

    8.14打卡 插入排序 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一...

  • c算法O(n)^2(一)

    选择排序 插入排序 优化插入排序算法

  • 面试基础算法复习

    排序算法 选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:都将数组分为已排序部分和未排序部分。选择排序将已...

  • Android程序员经常遇到的算法问题,七大常用的算法

    Android 常用算法1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [...

网友评论

      本文标题:数组排序算法 — 插入排序

      本文链接:https://www.haomeiwen.com/subject/tcanyctx.html