【问题标题】:Are the sorting algorithms used by NSArray stable sorts?NSArray 使用的排序算法是稳定排序吗?
【发布时间】:2012-05-16 05:40:02
【问题描述】:

NSArraystable中各种排序方法使用的排序算法是什么? (就像它们是“稳定排序”算法一样,具有相同排序键的项目会保留其相对顺序。)

【问题讨论】:

  • @TDeBailleul “试一试”在这种情况下并没有真正的帮助。排序在某些情况下可能是稳定的,但在其他情况下则不稳定,具体取决于数据的大小、数组的构造方式等。
  • 好的,我认为行为总是一样的。很高兴知道。
  • 如果单一情况下不稳定,则不稳定。所以“试一试”有帮助的。

标签: objective-c ios sorting nsarray


【解决方案1】:

除非您使用NSSortStable,否则无法保证稳定排序。来自documentation on NSSortOptions

NSSortStable

指定排序的结果应该返回具有相同值的比较项目,它们最初出现的顺序是相同的。

如果未指定此选项,则可能会或可能不会按原始顺序返回相同的对象。

如果您需要保证排序稳定,请尝试以下操作:

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

【讨论】:

  • (void)sortWithOptions:usingComparator: 适用于可变数组...还有 (NSArray *)sortedArrayWithOptions:usingComparator: 如果它能让你的船浮起来的话
【解决方案2】:

我发现的唯一“官方”答案是来自 Apple 的 Chris Kane 的 2002 mailing list post

NSArray/NSMutableArray 的排序方式的稳定性是不确定的, 所以你应该预料到它们是不稳定的。由于未定义, 情况也可能因版本而异,尽管我没有 (我自己)预计这很有可能。目前的实施 使用快速排序,该算法的一个版本几乎与 BSD 相同 qsort() 例程。一堆实验发现它 很难比我们对一般类型的数据做得更好 通过在测试。 [当然,如果有其他信息 关于被排序的数据,可以使用其他算法或 有助于这种情况的修改。]

我不知道这是否仍然正确,考虑到帖子的历史,但最好假设NSArray 的排序方法不稳定稳定。

【讨论】:

    【解决方案3】:

    doc 中,没有详细说明相同项目的最终顺序。

    因此,我觉得对订单做出任何假设都是一个坏主意。即使您通过实验确定顺序是什么,这也可能会根据数组中的项目数或运行排序的 iOS 版本而改变。

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

    【讨论】:

    • 即使我对它进行了彻底的测试,我也不会相信它,Apple 可能会在下一个版本中更改使用的算法,从而使任何测试变得毫无意义,并可能导致一些奇怪的错误。
    • 文档确实指定,它只是隐藏在NSSortOptions的文档后面:developer.apple.com/library/ios/#documentation/Cocoa/Reference/…
    猜你喜欢
    • 2010-09-13
    • 2016-05-23
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2017-06-02
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多