计数排序

基础知识 / counting-sort

本地源文件:docs/basic__counting-sort.md

计数排序

前置知识:前缀和

提醒

本页面要介绍的不是 基数排序

本页面将简要介绍计数排序.

定义

计数排序(英语:Counting sort)是一种线性时间的排序算法.

过程

计数排序的工作原理是使用一个额外的数组 𝐶C,其中第 𝑖i 个元素是待排序数组 𝐴A 中值等于 𝑖i 的元素的个数,然后根据数组 𝐶C 来将 𝐴A 中的元素排到正确的位置.1

它的工作过程分为三个步骤:

  1. 计算每个数出现了几次;
  2. 求出每个数出现次数的 前缀和
  3. 利用出现次数的前缀和,从右至左计算每个数的排名.

计算前缀和的原因

直接将 𝐶C 中正数对应的元素依次放入 𝐴A 中不能解决元素重复的情形.

我们通过为额外数组 𝐶C 中的每一项计算前缀和,结合每一项的数值,就可以为重复元素确定一个唯一排名:

额外数组 𝐶C 中每一项的数值即是该 key 值下重复元素的个数,而该项的前缀和即是排在最后一个的重复元素的排名.

如果按照 𝐴A 的逆序进行排列,那么显然排序后的数组将保持 𝐴A 的原序(相同 key 值情况下),也即得到一种稳定的排序算法.

counting sort animate example

性质

稳定性

计数排序是一种稳定的排序算法.

时间复杂度

计数排序的时间复杂度为 𝑂(𝑛 +𝑤)O(n+w),其中 𝑤w 代表待排序数据的值域大小.

代码实现

伪代码

1𝐈𝐧𝐩𝐮𝐭. An array 𝐴 consisting of 𝑛 positive integers no greater than 𝑤.2𝐎𝐮𝐭𝐩𝐮𝐭. Array 𝐴 after sorting in nondecreasing order stably.3𝐌𝐞𝐭𝐡𝐨𝐝. 4𝐟𝐨𝐫 𝑖←0 𝐭𝐨 𝑤5𝑐𝑛𝑡[𝑖]←06𝐟𝐨𝐫 𝑖←1 𝐭𝐨 𝑛7𝑐𝑛𝑡[𝐴[𝑖]]←𝑐𝑛𝑡[𝐴[𝑖]]+18𝐟𝐨𝐫 𝑖←1 𝐭𝐨 𝑤9𝑐𝑛𝑡[𝑖]←𝑐𝑛𝑡[𝑖]+𝑐𝑛𝑡[𝑖−1]10𝐟𝐨𝐫 𝑖←𝑛 𝐝𝐨𝐰𝐧𝐭𝐨 111𝐵[𝑐𝑛𝑡[𝐴[𝑖]]]←𝐴[𝑖]12𝑐𝑛𝑡[𝐴[𝑖]]←𝑐𝑛𝑡[𝐴[𝑖]]−113𝐫𝐞𝐭𝐮𝐫𝐧 𝐵1Input. An array A consisting of n positive integers no greater than w.2Output. Array A after sorting in nondecreasing order stably.3Method. 4for i←0 to w5cnt[i]←06for i←1 to n7cnt[A[i]]←cnt[A[i]]+18for i←1 to w9cnt[i]←cnt[i]+cnt[i−1]10for i←n downto 111B[cnt[A[i]]]←A[i]12cnt[A[i]]←cnt[A[i]]−113return B

C++Python

---|---

---|---

参考资料与注释

  1. 计数排序 - 维基百科,自由的百科全书
本页面最近更新: 2026/1/7 08:56:54,更新历史 发现错误?想一起完善?在 GitHub 上编辑此页! 本页面贡献者:NachtgeistW, Tiphereth-A, iamtwz, c-forrest, Enter-tainer, Junyan721113, ksyx, Xeonacid, Alisahhh, gi-b716, Great-designer, Konano, mcendu, Menci, minghu6, ouuan, shawlleyw, sun2snow, TrickEye 本页面的全部内容在CC BY-SA 4.0SATA 协议之条款下提供,附加条款亦可能应用