NSArray使用的排序算法是否稳定排序?

时间:2012-05-07 17:55:14

标签: objective-c ios sorting nsarray

NSArray stable中各种排序方法使用的排序算法是什么? (因为它们是“稳定排序”算法,其中具有相同排序键的项目保留了相对顺序。)

3 个答案:

答案 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的哪个版本运行排序而发生变化。

对我而言,我会坚持文件提供的承诺。