algorithm - 计数排序如何稳定?

标签 algorithm sorting stable-sort

假设我的输入是(abc来区分相等的键)

1 6a 8 3 6b 0 6c 4

我的计数排序将另存为(丢弃abc信息!)
0(1) 1(1) 3(1) 4(1) 6(3) 8(1)

这会给我结果
0 1 3 4 6 6 6 8

那么,这种稳定的排序方式如何?
我不知道它是如何“用相同的键维护记录的相对顺序”的。

请解释。

最佳答案

确实简单:它是一个链表,而不是每个“桶”的简单计数器。

也就是说,代替

0(1) 1(1) 3(1) 4(1) 6(3) 8(1)

你得到
0(.) 1(.) 3(.) 4(.) 6(a,b,c) 8(.)

(在这里,我使用.表示存储桶中的某些项目)。

然后将它们转储到一个排序列表中:
0 1 3 4 6a 6b 6c 8

也就是说,当您发现一个带有x键的项目时,知道它可能还有其他信息可以将其与具有相同键的其他项目区分开,那么,您不仅会增加存储桶x的计数器(这会丢弃所有这些额外的信息) 。

相反,您为每个存储桶都有一个链表(或具有固定时间摊销附加的类似顺序的数据结构),并在从左到右扫描输入时,将该项目附加到存储桶x的列表末尾。

因此,您无需在O(k)计数器中使用k空间,而是让O(k)最初为空列表,其长度总和在算法的“计数”部分的末尾将为n。这种计数排序的变体仍将像以前一样是O(n + k)

关于algorithm - 计数排序如何稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572195/

相关文章:

c# - .NET 中是否有任何内置的稳定排序例程和交换函数?

algorithm - 如何将以下不稳定的排序算法转换为稳定的?

javascript - 如何按数值对 2 个单独的数组进行排序?

c - 排序函数的意外行为

c - C 中的树结构,用于以预序深度优先方式导航

algorithm - 在 2D 中查找最近的对象 - 它可以在 O(n) 以下进行优化吗?

从链表创建一个数组并对该数组进行排序 C

javascript - Array.sort() 方法在不同浏览器中的稳定性如何?

algorithm - 用于查找有限集中与另一个点最接近的点的有效算法

c# - 如何根据日期选择范围内的随机数?