学习JavaScript排序算法-计数排序

399 阅读1分钟

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

上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列小总结系列更文-见文末

本文来继续学习 JavaScript 中的排序方法: 在实际工作中经常用到排序算法 计数排序

JavaScript 排序算法-计数排序

JavaScript 排序算法-计数排序-countingSort

计数排序 的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。

作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

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
}

更多阅读