这是我参与11月更文挑战的第18天, 活动详情查看: 2021最后一次更文挑战
上一篇文章学习了排序方法-选择排序, 另更多更文学习 JavaScript
的系列小总结更多阅读-list & 经典排序算法-list
本文来继续学习经典排序方法: 插入排序
(insertionSort
), 通常情况下, 插入排序要比选择排序快
JS 实现排序算法-插入排序
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。
插入排序 算法步骤
- 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
插入排序 JS 代码实现:
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人应该都比较容易理解了。
- 插入排序
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, `)
}
复制代码
更多阅读
- 【Array.prototype.map() 】、
- 【JS-特殊符号-位运算符】、
- 【ES6 - for/of】、
- 【JS-逻辑运算符-短路了?】、
- 【JS-箭头函数】、
- 【JavaScript-forEach()】、