学习经典排序算法-JS实现基数排序(radixSort)

875 阅读3分钟

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

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

前面还学了计数排序桶排序, 本文来继续学习经典排序方法: 非比较型-基数排序 (radixSort), 三者都是利用了的概念, 但是使用方法上有明显差异:

JS 实现排序算法-基数排序

基数排序是一种非比较型整数排序算法.

基数排序的原理: 将整数按位数切割成不同的数字, 然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数, 所以基数排序也不是只能使用于整数。

基数排序 算法步骤

基数排序-LSD-演示:

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

什么是 LSD

最低位优先法, 简称 LSD 法: 先从最低位开始排序, 再对次低位排序, 直到对最高位排序后得到一个有序序列;

基数排序 JS 代码实现:

  1. 插入排序 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)

更多阅读

经典排序算法: