学习经典排序算法-插入排序(insertionSort)

这是我参与11月更文挑战的第18天, 活动详情查看: 2021最后一次更文挑战

上一篇文章学习了排序方法-选择排序, 另更多更文学习 JavaScript 的系列小总结更多阅读-list & 经典排序算法-list

本文来继续学习经典排序方法: 插入排序 (insertionSort), 通常情况下, 插入排序要比选择排序快

JS 实现排序算法-插入排序

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

插入排序 算法步骤

  1. 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  2. 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

插入排序 JS 代码实现:

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人应该都比较容易理解了。

  1. 插入排序 insertionSort 函数实现
function insertionSort(arr) {
  var len = arr.length
  var preIndex, current
  for (var i = 1; i < len; i++) {
    preIndex = i - 1
    current = arr[i]
    while (preIndex >= 0 && arr[preIndex] > current) {
      arr[preIndex + 1] = arr[preIndex]
      preIndex--
    }
    arr[preIndex + 1] = current
  }
  return arr
}
// 引入下面的 测试代码耗时的方法: 进行测试插入排序对处理20000+条数据的排序耗时:
getFnRunTime(insertionSort)
复制代码

测试代码运行耗时的函数

这里 由于插入排序 insertionSort 比较适合数据量较小的数据进行排序, 故 20w+ 的数据并不太适合..

const testArrFn = function (len) {
  let arr = []
  const count = len
  for (let i = 0; i < count; i++) {
    arr[i] = Math.floor(Math.random() * 50 + 1)
  }
  return arr
}
复制代码

工具: 通过测试数据(数组), 方法执行的时间

let testArr = testArrFn(len)

let len = testArr.length
/**
 * @desc 方法函数执行的时间
 */
module.exports = async function getFnRunTime(fn) {
  let startTime = Date.now(),
    endTime
  let result = await fn(testArr)
  endTime = Date.now()
  console.log(testArr, result)
  console.log(, "test_array'length: " + len, result.length,`排序耗时-total time: ${endTime - startTime}ms, `)
}
复制代码

更多阅读

经典排序算法:

Guess you like

Origin juejin.im/post/7032660548151951367