Что означает, что алгоритм сортировки является «стабильным»?


43

Читая о различных алгоритмах сортировки, я заметил, что некоторые из них «стабильны», а некоторые нет. Что это значит, и какие компромиссы связаны с этим при выборе алгоритма?


32
На этот вопрос легко ответить в течение минуты с помощью Википедии. ru.wikipedia.org/wiki/Sorting_algorithm
Mare Infinitus,


4
Это вопрос, которому не хватает собственных исследований. Ответ с картинкой из Википедии. И это действительно хорошая обратная связь, которая меня расстраивает. ИМХО это надо закрывать, а не получать голоса против.
Mare Infinitus

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

4
Как правило, «просто гуглите» или «ищите в википедии» не являются приемлемыми ответами на сайтах StackExchange. Потому что они не дают ответа на то, что жалобщик проверяет как действительный вопрос с обращением к властям Google и Википедии. Если вопрос легко дублирует другой вопрос или вопросы в рамках programmers.stackexchange, вы можете пожаловаться.
Майкл Паукуонис

Ответы:


88

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

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

введите описание изображения здесь


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

9
Хорошая картинка, очень похожая на википедию en.wikipedia.org/wiki/Sorting_algorithm
Mare Infinitus

9
@MareInfinitus: это в свободном доступе. Проверьте атрибуцию на оригинальном изображении.
Роберт Харви

2
Хорошая картина объясняет быстрее и глубже, чем много слов в среднем случае. Юридические вопросы не были тем, о чем я хотел поговорить.
Маре Инфинитус

3
@RobertHarvey На самом деле, я считаю, что редактор правильный. Ваше сообщение в настоящее время говорит, что стабильная сортировка сохраняет порядок карт одной масти, но карты одной масти будут иметь разные ранги и, следовательно, должны быть переставлены для достижения сортированного порядка. Например, сортировка не сохраняет порядок 2 и 5 сердец. Именно порядок карт одинакового ранга (и разных мастей) делает разницу между стабильной и нестабильной.
Дэвид З,

26

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

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

Рассмотрим алгоритм сортировки, в котором мы сортируем коллекцию двумерных точек на основе их X-измерения.

Коллекция для сортировки: {(6, 3), (5, 5), (6, 1), (1, 3)}

Стабильный Сортировка: {(1, 3), (5, 5), (6, 3), (6, 1)}

Обычная Сортировка: Либо {(1, 3), (5, 5), (6, 3), (6, 1)}, или{(1, 3), (5, 5), (6, 1), (6, 3)}


Что касается компромисса ... ну, стабильная сортировка менее эффективна, но иногда она вам нужна.

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


2
Это менее эффективно, хотя? Это кажется «очевидным», но некоторые из лучших алгоритмов сортировки по своей природе стабильны (например, что-либо, основанное на сортировке слиянием, например, сортировка Тимом), им не нужно выполнять какую-либо явную дополнительную работу, чтобы быть стабильной.

9
Стабильный не имеет ничего общего с производительностью в целом. Mergesort работает в O (n * log n) и является стабильным. Heapsort имеет аналогичную производительность, но не является стабильной.
Маре Инфинитус

2
«Стабильный» может также применяться к структурам данных, например. «стабильная куча» - это куча, которая удаляет элементы, которые имеют одинаковый приоритет, в том же порядке, в котором они были поставлены в очередь. Это очень важно для эффективных алгоритмов поиска пути.
BlueRaja - Дэнни Пфлюгофт

1
Не существует стабильных сортировок, которые являются O (n ln n) сравнениями, а также O (1) в памяти. Скорость не единственная мера эффективности. Тот факт, что вы не можете стабильно сортировать на месте, имеет значение.
Вопрос

3
@QuestionC Похоже, что сортировка блоков стабильна и соответствует этим границам.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.