【发布时间】:2013-05-04 15:22:57
【问题描述】:
在 JavaScript(在其他地方有些适用)中,您不知道您的代码在哪个目标实现上运行,有没有办法检测底层排序算法(Array.sort)是否稳定,知道只是它遵循the specification?
我可以在 webkit (1) (2) 中找到 2 个测试,但是这些测试的可靠性如何? (这个检查可以用PCP 完成吗?)我正在寻找一个数学上合理的解决方案。
这是一个棘手的问题,因为更高级的排序算法可以根据源数组的长度(如 Timsort)更改子算法。我一直很困惑,因为我运行的每一个测试都显示谷歌浏览器的排序是稳定的,但我看到的所有文档都说它不稳定(the source 会告诉你原因)。
(通常,我使用this strategy 使我的排序稳定;它对性能的影响很小但有时很明显)
各种实现中排序的源代码:【问题讨论】:
-
你只能以概率的方式做出这样的决定:例如,我可以定义一个排序算法
S,它接受输入I。通常,S将实际排序工作分配给一些稳定的排序算法T,但是当I等于某个特殊值I'时,它使用非稳定排序U.你永远无法证明S是不稳定的,除非你运气好并且碰巧通过I'作为输入。更现实地说,也许S使用稳定排序,除非I很长。同样,如果您在适当长的输入上进行测试,您只会观察到不稳定的排序。 -
如果规范说它不稳定,这并不意味着当你对数组进行排序时你可以期望项目交换顺序,而是你不能依赖它;没有任何承诺。 (当前)实现恰好是稳定的并不意味着它将永远稳定,或者对于 chrome 运行的所有平台。
-
我同意@MarZab 的观点,即这是一个停止问题。如果您将其标记为
[computer-science]和/或[computer-science-theory],您可能会看到更多关注。
标签: javascript sorting computer-science computability