Что такое стабильность в алгоритмах сортировки и почему это важно?

Мне очень любопытно, почему стабильность или не важна в алгоритмах сортировки?

Ответ 1

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

Фон: "стабильный" алгоритм сортировки сохраняет элементы с тем же ключом сортировки по порядку. Предположим, что у нас есть список 5-буквенных слов:

peach
straw
apple
spork

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

apple
peach
straw
spork

В алгоритме сортировки неустойчивый straw или spork могут быть взаимозаменяемы, но в стабильном они остаются в одинаковых относительных положениях (то есть, поскольку straw появляется перед spork на входе, он также появляется перед spork на выходе).

Мы могли бы отсортировать список слов, используя этот алгоритм: стабильная сортировка по столбцу 5, затем 4, затем 3, затем 2, затем 1. В конце концов, он будет правильно отсортирован. Убедите себя в этом. (кстати, этот алгоритм называется сортировкой radix)

Теперь, чтобы ответить на ваш вопрос, предположим, что у нас есть список имен и фамилий. Нас просят сортировать "по фамилии, а затем по первой". Сначала мы могли отсортировать (стабильное или неустойчивое) по имени, а затем стабильное сортировать по фамилии. После этих сортировок список сортируется в первую очередь по имени. Однако, когда имена последних совпадают, сортируются первые имена.

Вы не можете складывать нестабильные сортировки тем же способом.

Ответ 2

Стабильный алгоритм сортировки - это тот, который сортирует идентичные элементы в том же порядке, что и на входе, в то время как неустойчивая сортировка может не удовлетворять этому случаю.

Стабильные алгоритмы сортировки:

  • Вставка Сортировка
  • Сортировка слиянием
  • Сортировка пузырьков
  • Тим Сорье
  • Подсчет сортировки

Нестабильные алгоритмы сортировки:

  • Куча сортировки
  • Выбор сортировки
  • Оболочка Shell
  • Быстрая сортировка

enter image description here

Ответ 3

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

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

Если вам не нужна стабильность, вы можете использовать быстрый алгоритм перехвата памяти из библиотеки, например, heapsort или quicksort, и забыть об этом.

Если вам нужна стабильность, это сложнее. Стабильные алгоритмы имеют более высокий приоритет CPU и/или памяти, чем нестабильные алгоритмы. Поэтому, когда у вас большой набор данных, вам нужно выбирать между избиением процессора или памяти. Если вы ограничены как процессором, так и памятью, у вас есть проблема. Хорошим компромиссным стабильным алгоритмом является двоичный вид дерева; Статья в Википедии имеет патетически легкую реализацию на С++, основанную на STL.

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

Ответ 4

Есть несколько причин, по которым стабильность может быть важна. Во-первых, если две записи не нужно заменять путем их замены, вы можете вызвать обновление памяти, страница будет помечена грязной и должна быть переписана на диск (или другой медленный носитель).

Ответ 5

Это зависит от того, что вы делаете.

Представьте, что у вас есть записи людей с первым и последним именем. Сначала вы сортируете список по имени. Если вы затем отсортируете список со стабильным алгоритмом по фамилии, у вас будет список, отсортированный по имени и фамилии.

Ответ 6

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

Однако любое заданное сортирующее альго, которое нестабильно, может быть изменено на стабильное. Может быть сортировка определенных алгоритмов, чтобы сделать его стабильным, но в целом любой алгоритм сортировки на основе сравнения, который не является стабильным по своей природе, может быть изменен, чтобы быть стабильным, изменяя операцию сравнения ключей, так что сравнение двух ключей рассматривает позицию как фактор для объектов с равными ключами.

Литература: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

Ответ 7

Я знаю, что для этого есть много ответов, но для меня этот ответ, Роберт Харви, резюмировал его гораздо более четко:

Устойчивая сортировка - это та, которая сохраняет исходный порядок входного набора, где [неустойчивый] алгоритм не различает два или более элементов.

Источник

Ответ 8

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

Однако объекты с одинаковым приоритетом при сортировке могут быть разными, а иногда их относительный порядок - это значимая информация. В этом случае неустойчивая сортировка порождает проблемы.

Например, у вас есть список данных, который содержит стоимость времени [T] всех игроков, чтобы очистить лабиринт с помощью Уровня [L] в игре. Предположим, нам нужно ранжировать игроков тем, как быстро они очищают лабиринт. Тем не менее, применяется дополнительное правило: игроки, которые очищают лабиринт с более высоким уровнем, всегда имеют более высокий ранг, независимо от того, сколько времени занимает время.

Конечно, вы можете попытаться сопоставить парное значение [T, L] с реальным числом [R] с некоторым алгоритмом, который следует правилам, а затем ранга всех игроков с [R] значением.

Однако, если стабильная сортировка возможна, вы можете просто отсортировать весь список с помощью [T] (сначала быстрые игроки), а затем по [L]. В этом случае относительный порядок игроков (по временной стоимости) не будет изменен после того, как вы сгруппировали их по уровню лабиринта, который они очистили.

PS: конечно, подход к сортировке дважды - не лучшее решение конкретной проблемы, но для объяснения вопроса о плакате этого должно быть достаточно.

Ответ 9

Стабильная сортировка всегда будет возвращать одно и то же решение (перестановка) на том же входе.

Например, [2,1,2] будет сортироваться с использованием стабильной сортировки в качестве перестановки [2,1,3] (сначала это индекс 2, затем индекс 1, а затем индекс 3 в отсортированном выпуске). Это означает, что вывод всегда перетасовывается так же. Другая нестабильная, но все же правильная перестановка - [2,3,1].

Быстрая сортировка не является стабильной сортировки и подстановочные различия между теми же элементами, зависит от алгоритма для сбора шарнира. Некоторые реализации выбираются случайным образом и могут быстро сортировать, что дает разные перестановки на одном и том же входе с использованием того же алгоритма.

Стабильный алгоритм сортировки необходим детерминированным.