Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are the sorting algorithms used by NSArray stable sorts?

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.)

like image 282
StCredZero Avatar asked May 07 '12 17:05

StCredZero


2 Answers

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.

like image 166
omz Avatar answered Nov 22 '22 04:11

omz


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];
}];
like image 22
wxactly Avatar answered Nov 22 '22 05:11

wxactly