这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列小总结系列更文-见文末
本文来继续学习 JavaScript 中的排序方法: 在实际工作中经常用到排序算法 计数排序
JavaScript 排序算法-计数排序
计数排序 的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。
作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
function countingSort(arr, maxValue) {
var bucket = new Array(maxValue + 1),
sortedIndex = 0
;(arrLen = arr.length), (bucketLen = maxValue + 1)
for (var i = 0; i < arrLen; i++) {
if (!bucket[arr[i]]) {
bucket[arr[i]] = 0
}
bucket[arr[i]]++
}
for (var j = 0; j < bucketLen; j++) {
while (bucket[j] > 0) {
arr[sortedIndex++] = j
bucket[j]--
}
}
return arr
}
// 引入下面的 测试代码耗时的方法: 进行测试希尔排序对处理20000+条数据的排序耗时:
getFnRunTime(countingSort)
测试函数代码运行耗时的方法
const testArrFn = function () {
let arr = []
const count = 200000
for (let i = 0; i < count; i++) {
arr[i] = Math.floor(Math.random() * 50 + 1)
}
return arr
}
let testArr = testArrFn()
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)
}
function merge(left, right) {
var result = []
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
while (left.length) result.push(left.shift())
while (right.length) result.push(right.shift())
return result
}