Документация для NSSortStable не грамматична - что она пытается сказать? - PullRequest
3 голосов
/ 21 марта 2012

У меня есть массив, который я хотел бы отсортировать, и, поскольку блоки "черного цвета" в этом году, я смотрел на

- (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr

Я посмотрел, какой вариант сортировки использовать, и в документации NSSortStable сказано:

Указывает, что отсортированные результаты должны возвращать сравниваемые элементы в одинаковом порядке в том порядке, в котором они возникли изначально.

Если эта опция не указана, равные объекты могут или не могут быть возвращены в их первоначальном порядке.

Мне не хватило кофе, чтобы понять, о чем он говорит, первое предложение даже грамматически неверно.

Кто-нибудь может перевести на английский для чайников?

Ответы [ 3 ]

7 голосов
/ 21 марта 2012

NSSortStable указывает, что если два объекта сравниваются одинаково, их порядок должен оставаться неизменным.

Например, давайте рассмотрим следующее:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", @"four", nil];
[array sortWithOptions:0 usingComparator:^NSComparisonResult(id obj1, id obj2) {
    if ( [obj1 length] < [obj2 length] )
        return NSOrderedAscending;
    if ( [obj1 length] > [obj2 length] )
        return NSOrderedDescending;
    return NSOrderedSame;
}];

Если вы не укажете NSSortStable, отсортированный массив может быть либо (one, two, four, three), либо (two, one, four, three), так как one и two имеют одинаковую длину. Оба результата приняты. Это позволяет алгоритму сортировки работать (немного) быстрее.

При указании NSSortStable объекты, которые сравниваются одинаково, должны быть возвращены в их первоначальном порядке (то есть сначала one, затем two).

3 голосов
/ 21 марта 2012

Стабильная сортировка - это та, которая максимально сохраняет порядок элементов.

Например, если вы сортируете по фамилиям, то при стабильной сортировке имена будут сохраняться в том же порядке, в котором они изначально были в контейнере. То есть если бы у нас было:

Bob Smith
Tom Jones
Dave Smith
Fred Smith
Al Jones

Это будет сортировать по

Tom Jones
Al Jones
Bob Smith
Dave Smith
Fred Smith

Обратите внимание, что Том все еще выше Ала, а Боб все еще выше Дейва, который все еще выше Фреда.

«Нестабильная сортировка» не будет пытаться сохранить вторичное упорядочение, и в результате может работать немного быстрее.

http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

1 голос
/ 21 марта 2012

Я считаю, что 'иметь' должно быть 'иметь', например так:

Указывает, что отсортированные результаты должны возвращать сравниваемые элементы , имеющие равное значение в порядке, в котором они возникли изначально.

То есть, если сравниваемые элементы имеют одинаковое значение, эти элементы должны сохранять свою сортировку относительно друг друга в конечных результатах.

...