稳定排序,即最小破坏性排序

时间:2010-07-21 23:17:28

标签: list sorting wolfram-mathematica utilities

假设我有一个事物列表(数字,为了简化这里),我有一个函数,我想用它来排序,使用SortBy。 例如,以下按最后一位数字对数字列表进行排序:

SortBy[{301, 201}, Mod[#,10]&]

并注意这些数字中的两个(即所有数字)具有相同的最后一位数。 所以我们将它们归还给哪个顺序并不重要。 在这种情况下,Mathematica以相反的顺序返回它们。 如何确保所有关系都被打破,以支持在原始列表中订购商品的方式?

(我知道这有点微不足道,但我觉得这种情况不时出现所以我认为将它放在StackOverflow上会很方便。如果没有人节拍,我会发布任何我想出的答案我,它。)

尝试使其更易于搜索:按最小干扰排序,按交换次数最少排序,自定义打破平局,使用代价高昂的交换进行排序,稳定排序

PS:感谢Nicholas指出这称为稳定排序。这是我的舌尖!这是另一个链接:http://planetmath.org/encyclopedia/StableSortingAlgorithm.html

4 个答案:

答案 0 :(得分:18)

答案 1 :(得分:6)

GatherBy能做你想做的吗?

Flatten[GatherBy[{301, 201, 502, 501, 101}, Mod[#, 10] &]]

答案 2 :(得分:4)

答案 3 :(得分:3)

这似乎有效:

stableSortBy[list_, f_] := 
  SortBy[MapIndexed[List, list], {f@First[#], Last[#]}&][[All,1]]

但现在我看到rosettacode提供了一个更好的方法:

stableSortBy[list_, f_] := list[[Ordering[f /@ list]]]

所以订购是关键!似乎Mathematica文档没有提到这种有时重要的差异排序和排序。