用JavaScript实现计数排序(元素可为负数)

376 阅读1分钟

一、简介

  • 计数排序是一个 基于 比较交换位置 的排序算法
  • 适用场景:知道数值范围的大体量排序, 比如高考分数排名
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

二、核心思想

  • 从小到大的记录每个元素出现的次数
  • 再把记录到的元素 push 到 新数组,记录了几次就push几次

三、排序过程图

计数排序.gif

四、代码实现

4.1 大致步骤:

  1. 确定数值范围,创建count数组,count.length = max - min + 1,此数组用于统计待排序数组元素出现次数
  2. 将count数组中统计好的元素出现次数push到一个新数组中,出现几次就push几次

4.2 具体代码:

const countSort = function(arr) {
  // 最后返回的排序好的数组
  const res = []
  
  // 数值范围
  const max = Math.max(...arr)
  const min = Math.min(...arr)
  
  // 统计待排序数组元素出现次数的数组,数组长度为max-min+1
  const count = new Array(max - min + 1).fill(0)
  
  // 遍历待排序数组,统计元素出现次数
  for(let i = 0; i < arr.length; i++) {
    count[arr[i] - min]++
  }
  
  // 将count数组中统计到的元素 push 到 res数组中, 元素出现几次就push几次
  for (let i = 0; i < count.length; i++) {
    while(count[i] > 0) {
      res.push(count[i] + min)
      count[i]--
    }
  }  
  
  return res;
}