这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列小总结更多阅读-list & 经典排序算法-list
本文来继续学习经典排序方法: 选择排序 (selectionSort)
JS 实现排序算法-选择排序 selectionSort
选择排序(selectionSort) 是一种简单直观的排序算法.
无论什么数据进去, 时间复杂度都是 O(n²): 假设被排序的数列中有 N个数。遍历一趟的时间复杂度是O(N),因需要遍历 N-1次 . 因此,选择排序的时间复杂度是 [O(n²)]
所以选择"选择排序", 则数据规模越小越好, 唯一的好处可能就是不占用额外的内存空间
选择排序 算法步骤
每一次循环都是对剩余元素进行循环-操作排序
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕。
选择排序 JS 代码实现:
- 选择排序 selectionSort 函数实现
function selectionSort(arr) {
let len = arr.length
let minIndex, temp // 记录最小值的下标 及中间缓存用值
for (var i = 0; i < len - 1; i++) {
minIndex = i
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
// 寻找最小的数
minIndex = j // 将最小数的索引保存
}
}
temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
// 引入下面的 test代码耗时的方法: 进行测试排序对处理100+条数据的排序耗时:
getFnRunTime(selectionSort)
测试代码运行耗时的方法
这里 由于选择排序 会一遍一遍地遍历剩余数据(基数大则很慢) 比较适合数据量较小的数据进行排序, 故 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(`total time: ${endTime - startTime}ms, `, "test array'length: " + len, result.length)
}
更多阅读
- 【Array.prototype.map() 】、
- 【JS-特殊符号-位运算符】、
- 【ES6 - for/of】、
- 【JS-逻辑运算符-短路了?】、
- 【JS-箭头函数】、
- 【JavaScript-forEach()】、