计数排序
计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出。
01 算法步骤
-
找到数列的最大值,计为
max
-
新建一个长度为
max + 1
的数组,计为bucket
-
遍历数列,在
bucket
中找到值对应的下标,若对应下标里已有值,值加 1,若无值,将值设置为 1,例如值为5,则找到 bucket 中下标为 5 的位置,即
bucket [5]
,若bucket [5]
不存在,则设置bucket [5]
为1,即bucket [5] = 1
,若bucket [5]
存在,则值加 1,即bucket [5]++
-
遍历
bucket
,对于存在值的元素,设其值为count
,下标为index
,往结果数组中插入count
个元素,元素的值为index
例如bucket [5] = 3
,则count = 3
,index = 5
,往结果数组中插入 3 个 5。
02 示例
我们取 2, 3, 8, 7, 1, 2, 2, 2, 7, 3, 9, 8, 2, 1, 4, 2, 4, 6, 9, 2 来示范
-
找到最大值为 9
-
新建一个长度为 10 的数组,[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
-
找到下标 2,将其值置为 1,得 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
找到下标 3,将其值置为 1,得 [0, 0, 1, 1, 0, 0, 0, 0, 0, 0]
找到下标 8,将其值置为 1,得 [0, 0, 1, 1, 0, 0, 0, 0, 1, 0]
找到下标 7,将其值置为 1,得 [0, 0, 1, 1, 0, 0, 0, 1, 1, 0]
找到下标 1,将其值置为 1,得 [0, 1, 1, 1, 0, 0, 0, 1, 1, 0]
找到下标 2,将其内值加 1,得 [0, 1, 2, 1, 0, 0, 0, 1, 1, 0]
找到下标 2,将其内值加 1,得 [0, 1, 3, 1, 0, 0, 0, 1, 1, 0]
找到下标 2,将其内值加 1,得 [0, 1, 4, 1, 0, 0, 0, 1, 1, 0]
找到下标 7,将其内值加 1,得 [0, 1, 4, 1, 0, 0, 0, 2, 1, 0]
找到下标 3,将其内值为 1,得 [0, 1, 4, 2, 0, 0, 0, 2, 1, 0]
找到下标 9,将其值置为 1,得 [0, 1, 4, 2, 0, 0, 0, 2, 1, 1]
找到下标 8,将其内值加 1,得 [0, 1, 4, 2, 0, 0, 0, 2, 2, 1]
找到下标 2,将其内值加 1,得 [0, 1, 5, 2, 0, 0, 0, 2, 2, 1]
找到下标 1,将其内值加 1,得 [0, 2, 5, 2, 0, 0, 0, 2, 2, 1]
找到下标 4,将其值置为 1,得 [0, 2, 5, 2, 1, 0, 0, 2, 2, 1]
找到下标 2,将其内值加 1,得 [0, 2, 6, 2, 1, 0, 0, 2, 2, 1]
找到下标 4,将其内值加 1,得 [0, 2, 6, 2, 2, 0, 0, 2, 2, 1]
找到下标 6,将其值置为 1,得 [0, 2, 6, 2, 2, 0, 1, 2, 2, 1]
找到下标 9,将其内值加 1,得 [0, 2, 6, 2, 2, 0, 1, 2, 2, 2]