Are the sorting algorithms used by NSArray stable

2020-02-06 23:43发布

Are the sorting algorithms used by the various sorting methods in NSArray stable? (As in are they "stable sort" algorithms, where items with the same sort key have their relative orders preserved.)

3条回答
手持菜刀,她持情操
2楼-- · 2020-02-07 00:24

In the doc, no details are given as to the final order of identical items.

Therefore, I feel making any assumptions about the order would be a bad idea. Even if you determine experimentally what the order is, this could change based on the number of items in the array or which version of iOS runs the sort.

For me, I would stick with the promises provided by documentation.

查看更多
甜甜的少女心
3楼-- · 2020-02-07 00:31

Stable sort is not guaranteed unless you use NSSortStable. From the documentation on NSSortOptions:

NSSortStable

Specifies that the sorted results should return compared items have equal value in the order they occurred originally.

If this option is unspecified equal objects may, or may not, be returned in their original order.

If you need to guarantee a stable sort, try something like:

[array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1 compare:obj2];
}];
查看更多
混吃等死
4楼-- · 2020-02-07 00:33

The only "official" answer I've found about this is a 2002 mailing list post by Chris Kane from Apple:

The stability of NSArray/NSMutableArray's sorting methods is undefined, so you should anticipate that they are unstable. Being undefined, the situation may also change from release to release, though I don't (myself) anticipate that this is likely. The current implementation uses quick sort, a version of the algorithm nearly identical to BSD's qsort() routine. A bunch of experimentation found at one point that it was hard to do better than that for the general types of data we through at the tests. [Of course, if one has additional information about the data being sorted, one can use other algorithms or modifications which help that case.]

I don't know whether this is still true, given how old the post is, but it's probably best to assume that NSArray's sorting methods are not stable.

查看更多
登录 后发表回答