Data Structures Algorithms 简明教程
Counting Sort Algorithm
计数排序是外部排序算法,它假定所有输入值都是介于 0 和 k 之间的整数。然后对这些输入值进行数学计算,以将它们置于输出数组中的正确位置。
该算法使用计数器来计算数字出现的频率,并按相应的顺序排列它们。假设数字“m”在输入序列中出现 5 次,则该计数器的值将变为 5,且在输出数组中重复 5 次。
Counting Sort Algorithm
计数排序算法假定输入相对较小,因此算法如下 −
*步骤 1 *− 维护两个数组,一个大小为不重复的输入元素以存储计数值,另一个大小为输入数组以存储输出。
*步骤 2 *− 使用全 0 初始化计数数组,保持输出数组为空。
*步骤 3 *− 每次元素出现在输入列表中,将对应的计数器值增加 1,直至达到输入列表的末尾。
*步骤 4 *− 现在,在输出数组中,每次计数器大于 0 时,将元素添加到其相应索引处,即如果“0”的计数器为 2,则把“0”添加到输出数组的第 2 个位置(即第 1 个索引处)。然后将计数器值减 1。
*步骤 5 *− 重复步骤 4,直至所有计数器值变为 0。获得的列表即为输出列表。
COUNTING-SORT(A, B, k)
let C[0 … k] be a new array
for i = 0 to k
C[i] = 0
for j = 1 to A.length
C[A[j]] = C[A[j]] + 1
// C[i] now contains the number of elements equal to i.
for i = 1 to k
C[i] = C[i] + C[i – 1]
// C[i] now contains the number of elements less than or equal to i.
for j = A.length downto 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j – 1]
Example
考虑一个要排序的输入列表为 0, 2, 1, 4, 6, 2, 1, 1, 0, 3, 7, 7, 9。
为了更容易计算,我们从个位数开始。
Step 1
创建两个数组:一个用于存储计数器,另一个用于存储输出。使用 0 初始化计数器数组。
Step 2
在将所有计数器值增加直到达到输入列表的末尾后,我们实现以下内容 −
Step 3
现在,将元素推送到输出列表中相应索引处。
Step 4
在输出数组中添加元素后,将计数器减少 1。现在,1 添加到了第 4 个索引中。
Step 5
添加上一步中索引之前剩下的值。
Step 6
在添加完最后一个值后,我们得到
最终排序的输出为 0、0、1、1、1、2、2、3、4、6、7、7、9