学习首页/排序算法/计数排序交互演示 · JavaScript

排序算法 COUNTING SORT

计数排序.

统计各数值出现次数,再按累计位置写入输出数组。

时间O(n + k)额外空间O(n + k)稳定性稳定

原理与执行逻辑

利用整数值域直接统计频次,再把频次累加成位置边界。每个元素根据累计计数放入输出数组,避免逐对比较。

执行步骤

  1. 建立计数数组,统计每个数值出现次数。
  2. 累加计数,使 count[v] 表示不大于 v 的元素数量。
  3. 逆序扫描输入,将 v 放到 --count[v] 对应的位置。
  4. 把输出数组复制回原数组。

关键理解

逆序扫描与从右端分配位置配合,使相等元素保持原顺序。空间开销受最大值影响,值域很大时计数数组也会很大。

简短示例

[2, 1, 2] 中不大于 1 的元素有 1 个,不大于 2 的有 3 个;两个 2 从后向前放到下标 2、1,1 放到下标 0。

代码与执行动画

STEP 0 / 20
计数排序
function countingSort(arr) {  const count = Array(Math.max(...arr) + 1).fill(0);  for (const value of arr) count[value]++;  for (let v = 1; v < count.length; v++) count[v] += count[v - 1];  const output = Array(arr.length);  for (let i = arr.length - 1; i >= 0; i--) {    output[--count[arr[i]]] = arr[i];  }  for (let i = 0; i < arr.length; i++) arr[i] = output[i];  return arr;}
11 行 · 0 个片段标记

高亮对应当前步骤;源码对传入数组进行原地排序。

数组状态

升序 · 8 个元素
比较 0实际交换 0数组写入 0当前区间 —
待排序当前操作已就位

下标显示在底部;柱体随元素移动,等值元素也保留独立身份。

0

准备排序

点击下一步或自动播放,观察数组从左到右升序排列的过程。

调整待排序数组

使用相同数据切换算法,观察比较与交换过程。

2 至 12 个整数,范围 1 至 99;逗号或空格分隔。

算法要点

计数排序的执行规则

k 是最大值加一。适合值域较小的非负整数;本实现逆序填充输出,保持稳定性。

交换次数仅统计两个不同位置的交换;可输入重复值。

对应题目与扩展练习

观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。