2012-05-07 1 views
10

Являются ли алгоритмы сортировки, используемые различными методами сортировки в NSArray stable? (Как и в случае, они являются алгоритмами «стабильного сортирования», когда элементы с таким же ключом сортировки сохраняют относительные порядки.)Являются ли алгоритмы сортировки используемыми стабильными сортами NSArray?

+1

ли вы дать ему попробовать? –

+6

@TDeBailleul «Давать ему попробовать» в этом случае не очень полезно. Сортировка может быть стабильной в некоторых случаях, но не в других, в зависимости от размера данных, способа построения массива и т. Д. – omz

+0

Хорошо, я думал, что поведение всегда было одинаковым. Хорошо знать. –

ответ

4

В doc подробных данных об окончательном заказе одинаковых предметов не приводится.

Поэтому я считаю, что любые предположения о заказе были бы плохими идеями. Даже если вы экспериментально определите, что такое заказ, это может измениться в зависимости от количества элементов в массиве или какой версии iOS выполняет сортировку.

Для меня я придерживался обещаний, предоставленных документацией.

+0

Я бы не стал им доверять, даже если бы я полностью его протестировал, Apple может изменить используемый алгоритм (ы) в следующей версии, оказывая любые тесты бессмысленно и может вызвать некоторые странные ошибки. – JustSid

+4

Документация * указывает *, она просто похоронена за документацией для 'NSSortOptions': https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference. html # // apple_ref/doc/c_ref/NSSortOptions – wxactly

5

только «официальный» ответ, который я нашел про это 2002 mailing list post Крис Кейн от компании Apple:

Устойчивость методов сортировки NSArray/NSMutableArray является неопределенным, поэтому следует ожидать, что они неустойчиво. Будучи неопределенным, ситуация может также измениться с момента выпуска на выпуск, хотя я не (я) ожидаю, что это вероятно. Текущая реализация использует быструю сортировку, версию алгоритма, почти идентичную процедуре qsort() BSD qsort(). Несколько экспериментов, найденных в какой-то момент, что было трудно сделать лучше, чем для общих типов данных, мы провели на тестах. [Конечно, если у Вас есть дополнительная информация о данных, отсортированных, можно использовать другие алгоритмы или модификации, которые помогают тот случай.]

Я не знаю, является ли это все еще верно, учитывая, сколько лет пост, но, вероятно, лучше всего предположить, что методы сортировки NSArray: не стабильный.

16

Стабильный сорт не гарантируется, если вы не используете NSSortStable. Из documentation on NSSortOptions:

NSSortStable

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

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

Если вам нужно, чтобы гарантировать стабильную сортировку, попробовать что-то вроде:

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

'(void) sortWithOptions: usingComparator:' работает для изменяемых массивов ... есть также '(NSArray *) sortedArrayWithOptions: usingComparator:' если это плавает на вашей лодке – wxactly

Смежные вопросы