2012-05-07 165 views
10

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

+1

你试试看? –

+6

@TDeBailleul“给它一个尝试”在这种情况下并不真正有用。在某些情况下,排序可能是稳定的,但在其他情况下,排序可能是稳定的,这取决于数据的大小,阵列的构建方式等。 – omz

+0

好吧,我认为行为总是一样的。很高兴知道。 –

回答

4

doc中,没有给出关于相同项目的最终顺序的细节。

所以,我觉得作出有关的秩序将是一个坏主意任何假设。即使您通过实验确定订单是什么,这可能会根据数组中的项目数量或iOS的哪个版本进行排序来更改。

对于我来说,我会坚持与文档所提供的承诺。

+0

即使我已经彻底测试过了,我也不会相信它,Apple可能会在下一个版本中更改使用的算法,使得任何测试都毫无意义,并可能导致一些奇怪的错误。 – JustSid

+4

文档*确实指定了它,它只是隐藏在'NSSortOptions'的文档之后:https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference。 html#// apple_ref/doc/c_ref/NSSortOptions – wxactly

5

唯一的“官方”的答案,我发现这个是一个2002 mailing list post由克里斯·凯恩从苹果:

的NSArray/NSMutableArray里的排序方法的稳定性是不确定的, 所以你应该预料到他们不稳定。由于未定义,所以 的情况可能也会随着发布而变化,但我并不是 (我)预计这很可能。目前的实现 使用快速排序,该算法的一个版本几乎与BSD的qsort()例程相同。实验一束在一个点上发现它 很难通过一般类型的数据,我们 在测试做的更好。 [当然,如果一个人有更多的信息 有关数据进行排序,可以使用其他算法或 修改有助于这种情况。]

我不知道这是否仍然是正确的,给予多大该帖子是,但它可能是最好的假设NSArray的排序方法是不是稳定。

16

稳定的排序不能保证,除非你用NSSortStable。从documentation on NSSortOptions

NSSortStable

指定排序的结果应返回的项目相比,在他们最初发生的顺序同等价值。

如果该选项未被指定等于对象可能或可能不会在原来的顺序返回。

如果你需要保证一个稳定的排序,你可以试试:

[array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) { 
    return [obj1 compare:obj2]; 
}]; 
+0

'(void)sortWithOptions:usingComparator:'适用于可变数组... ...还有'(NSArray *)sortedArrayWithOptions:usingComparator:'如果那浮起你的船 – wxactly