Являются ли алгоритмы сортировки используемыми стабильными сортами NSArray?

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

Ответ 1

Стабильная сортировка не гарантируется, если вы не используете NSSortStable. Из документации по NSSortOptions:

NSSortStable

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

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

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

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

Ответ 2

Единственный "официальный" ответ, который я нашел об этом, - это почтовый лист 2002 года от Криса Кейна от Apple:

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

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

Ответ 3

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

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

Для меня я придерживаюсь promises, предоставленного документацией.