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.)
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.
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];
}];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With