NSArray stable中各种排序方法使用的排序算法是什么? (因为它们是“稳定排序”算法,其中具有相同排序键的项目保留了相对顺序。)
答案 0 :(得分:17)
除非您使用NSSortStable
,否则无法保证稳定排序。来自documentation on NSSortOptions:
NSSortStable
指定排序结果应返回比较项目按其最初发生的顺序具有相同值。
如果未指定此选项,则可能会或可能不会按原始顺序返回相等的对象。
如果您需要保证稳定排序,请尝试以下方法:
[array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
答案 1 :(得分:6)
我发现这个问题的唯一“官方”回答是来自Apple的Chris Kane的2002 mailing list post:
NSArray / NSMutableArray的排序方法的稳定性未定义, 所以你应该预料到它们不稳定。未定义, 情况也可能因发布而异,但我没有 (我自己)预计这很可能。目前的实施 使用快速排序,这个算法的版本几乎与BSD相同 qsort()例程。一堆实验发现了它 对于我们的一般数据类型来说,很难做得更好 通过测试。 [当然,如果有其他信息 关于正在排序的数据,可以使用其他算法或 有助于这种情况的修改。]
我不知道这是否仍然是真的,考虑到帖子的年龄,但最好假设NSArray
的排序方法不稳定。
答案 2 :(得分:4)
在doc中,没有详细说明相同项目的最终顺序。
因此,我觉得对订单做任何假设都是个坏主意。即使您通过实验确定订单是什么,这可能会根据数组中的项目数或iOS的哪个版本运行排序而发生变化。
对我而言,我会坚持文件提供的承诺。