Являются ли алгоритмы сортировки, используемые различными методами сортировки в 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, предоставленного документацией.