Относительно вашего вопроса, означающего «стабильный», давайте рассмотрим следующее: у нас есть класс детей, связанных с возрастом:
Phil, 10
Hans, 10
Eva, 9
Anna, 9
Emil, 8
Jonas, 10
Теперь мы хотим отсортировать детей в порядке возрастания (и ничего больше).Затем мы видим, что Филу, Гансу и Джонасу по 10 лет, поэтому неясно, в каком порядке мы должны их заказать, поскольку мы сортируем по возрасту .
Теперь наступает стабильность: Если мы сортируем stable , мы сортируем Фила, Ганса и Джонаса в том порядке, в котором они были раньше, то есть сначала мы помещаем Фила, затем Ганса и, наконец, Джонаса (просто потому, что они были в этом порядке в оригиналепоследовательность, и мы рассматриваем только возраст как критерий сравнения).Точно так же мы должны поставить Еву перед Анной (оба того же возраста, но в оригинальной последовательности, Ева была до Анны).
Итак, результат:
Emil, 8
Eva, 9
Anna, 9
Phil, 10 \
Hans, 10 | all aged 10, and left in original order.
Jonas, 10 /
Чтобы поставить егов двух словах: Стабильность означает, что если два элемента равны (по выбранному критерию сортировки), то элемент, идущий первым в исходной последовательности, все равно будет первым в результирующей последовательности.
Обратите внимание , что вы можете легко преобразовать любой алгоритм сортировки в стабильный алгоритм сортировки: если ваша исходная последовательность содержит n
элементов: e1, e2, e3, ..., en
, вы просто прикрепляете счетчик к каждому: (e1, 0), (e2, 1), (e3, 2), ..., (en, n-1)
.Это означает, что вы сохраняете для каждого элемента его исходное положение.
Если теперь два элемента равны, вы просто сравниваете их счетчики и ставите один с меньшим значением счетчика первым.Это увеличивает время выполнения (и память) на O(n)
, что асимптотически не ухудшается, поскольку для лучшего алгоритма сортировки (сравнения) уже требуется O(n lg n)
.