📅  最后修改于: 2020-12-10 06:18:25             🧑  作者: Mango
这是一种线性时间排序算法,通过不进行比较而可以更快地工作。假定要排序的数字在1到k的范围内,其中k很小。
基本思想是确定最终排序数组中每个数字的“等级”。
首先,C [x]是A [j]的元素数量,它们等于x
我们设置B [C [x]] = A [j]
如果有重复项,我们将在复制后递减C [i]。
Counting Sort (array P, array Q, int k)
1. For i ← 1 to k
2. do C [i] ← 0 [ θ(k) times]
3. for j ← 1 to length [A]
4. do C[A[j]] ← C [A [j]]+1 [θ(n) times]
5. // C [i] now contain the number of elements equal to i
6. for i ← 2 to k
7. do C [i] ← C [i] + C[i-1] [θ(k) times]
8. //C[i] now contain the number of elements ≤ i
9. for j ← length [A] down to 1 [θ(n) times]
10. do B[C[A[j] ← A [j]
11. C[A[j] ← C[A[j]-1
说明:
步骤1: for循环将数组R初始化为“ o”。但是在第一步中,将循环变量1初始化为k或将0初始化为k存在矛盾。由于基于最小值0-1进入数组A(输入数组)。基本上,我们从输入数组“ A”中的最小值开始
对于步骤3到4的循环,检查每个输入元素。如果输入元素的值为“ i”,则将C [i]递增。因此,在步骤5之后,对于每个整数i = 0、1、2 …. k,C [i]保持输入元素的数量等于I。
循环的步骤6至8确定每个i = 0、1 …..多少个输入元素小于或等于i
对于步骤9到11的循环,将每个元素A [j]放入输出数组B中的正确排序位置。对于每个A [j],值C [A [j]]是A [j]的正确最终位置输出数组B中的[],因为存在C [A [j]]个元素小于或等于A [i]。
由于元素可能并不完全不同,因此,每次将值A [j]放入数组B时,我们都会将C [A [j]减1。 ,移到输出数组中A [j]之前的位置。
总时间是θ(k + n)时间。
注意:
示例:举例说明数组中计数排序的操作。
A= ( 7,1,3,1,2,4,5,7,2,4,3)
解:
图:初始A和C阵列
For j=1 to 11
J=1, C [1, k] =
图:A [1] = 7已处理
J=2, C [1, k] =
图:A [2] = 1已处理
J=3, C [1, k]
图:A [3] = 3已处理
J=4, C [1, k]
图:A [4] = 1已处理
J=5, C [1, k]
图:A [5] = 2已处理
图:C现在包含A元素的数量
注意:这里将逐个扫描“ A”项并将其放置在“ C”中的位置,并且在“ C”数组中的项中将提及访问该项的次数,并且将其更新或计数器增加如果再次访问任何项目,则为1。
现在,将使用以下语句执行for循环i = 2至7:
C [i] = C [i] + C [i-1]
通过应用这些条件,我们将按照我所说的将C更新为2到7
图:C设置为对A的每个数字进行排名
现在,我们将找到新的数组B
现在有两个条件适用:
我们将计数器一减一
我们从最后一个位置开始扫描a中的元素。
a中的元素成为c中的职位<="" p="">
For j ← 11 to 1
图:A [11]放置在输出数组B中
图:A [10]放置在输出数组B中
图:A [9]放置在输出数组B中
图:A [8]放置在输出数组B中
图:A [7]放置在输出数组B中
图:A [6]放置在输出数组B中
图:A [5]放置在输出数组B中
图:A [4]放置在输出数组B中
图:A [3]放置在输出数组B中
图:A [2]放置在输出数组B中
图:B现在包含最终排序的数据。
我们从最后一个位置开始扫描a中的元素。