这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
在上一篇文章学习了排序方法-桶排序, 另更多更文学习 JavaScript 的系列小总结更多阅读-list & 经典排序算法-list
前面还学了计数排序和桶排序, 本文来继续学习经典排序方法: 非比较型-基数排序 (radixSort), 三者都是利用了桶的概念, 但是使用方法上有明显差异:
JS 实现排序算法-基数排序
基数排序是一种非比较型整数排序算法.
基数排序的原理: 将整数按位数切割成不同的数字, 然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数, 所以基数排序也不是只能使用于整数。
基数排序 算法步骤
- 将第一待排序序列第一个元素看做一个有序序列, 把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序序列, 将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等, 则将待插入元素插入到相等元素的后面。)
什么是 LSD
最低位优先法, 简称 LSD 法: 先从最低位开始排序, 再对次低位排序, 直到对最高位排序后得到一个有序序列;
基数排序 JS 代码实现:
- 插入排序
radixSort函数实现
// LSD Radix Sort
var counter = []
function radixSort(arr, maxDigit) {
var mod = 10
var dev = 1
for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
for (var j = 0; j < arr.length; j++) {
var bucket = parseInt((arr[j] % mod) / dev)
if (counter[bucket] == null) {
counter[bucket] = []
}
counter[bucket].push(arr[j])
}
var pos = 0
for (var j = 0; j < counter.length; j++) {
var value = null
if (counter[j] != null) {
while ((value = counter[j].shift()) != null) {
arr[pos++] = value
}
}
}
}
return arr
}
测试代码运行耗时的函数
这里 由于插入排序 radixSort 比较适合数据量较小的数据进行排序, 故 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, `)
}
// 引入上面的 统计代码耗时的方法: 进行测试基数排序对处理2000+条数据的排序耗时:
getFnRunTime(radixSort)
更多阅读
- 【Array.prototype.map() 】、
- 【JS-特殊符号-位运算符】、
- 【ES6 - for/of】、
- 【JS-逻辑运算符-短路了?】、
- 【JS-箭头函数】、
- 【JavaScript-forEach()】、