Почему нестабильная сортировка считается плохой

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


person Maxim Gershkovich    schedule 11.05.2011    source источник
comment
Кто считает это плохим? У вас есть цитата или ссылка или ссылка? Было бы полезно иметь некоторый контекст для такого рода оценочных суждений.   -  person S.Lott    schedule 11.05.2011
comment
возможный дубликат В чем преимущество сортировки алгоритм должен быть стабильным?   -  person nawfal    schedule 13.06.2014


Ответы (4)


Если у вас есть графический интерфейс, который позволяет людям сортировать отдельные столбцы, щелкая по этому столбцу, и вы используете стабильную сортировку, то люди, которые знают, могут получить сортировку по нескольким столбцам для столбцов A, B, C, щелкнув столбцы C, Б, А именно в таком порядке. Поскольку сортировка стабильна, при нажатии на B любые записи с одинаковыми ключами под B будут по-прежнему сортироваться по C, поэтому после нажатия на B записи сортируются по B, C. Точно так же после нажатия на A записи сортируются. по А, В, С.

(К сожалению, в прошлый раз, когда я пробовал это на том или ином продукте Microsoft, мне показалось, что он не использует стабильную сортировку, так что неудивительно, что этот трюк малоизвестен).

person mcdowella    schedule 11.05.2011
comment
Хороший пример. Но вы хотите сказать, что существует нестабильный продукт Microsoft? Шокирует! :) - person Ted Hopp; 11.05.2011
comment
Рад, что прочитал это. мне не приходило в голову, что такая вещь не будет использовать надежную сортировку. - person Michael Wilson; 14.08.2012
comment
Но разве нестабильную сортировку нельзя всегда сделать стабильной, добавив rownum/index или какой-либо другой уникальный счетчик в качестве последнего элемента составного ключа сортировки? Если я что-то упустил, добавление этого кажется тривиальным. - person Drakarah; 14.02.2015
comment
@ drake7707 Таким образом, вы действительно можете создать стабильную сортировку из нестабильной сортировки. Было бы неплохо, если бы API-интерфейсы сортировки всегда писались с учетом этого варианта использования, а графические интерфейсы всегда использовали это для обеспечения стабильной сортировки для пользователя. Увы, это происходит не всегда. - person mcdowella; 23.02.2015

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

person Ernest Friedman-Hill    schedule 11.05.2011
comment
Я не думаю, что это действительно хорошее сравнение, потому что и масть, и число должны учитываться для любой функции сравнения. Также обратите внимание, что если бы вы использовали для этого стабильный метод сортировки, вам пришлось бы сортировать по номеру, а затем по костюму, но не наоборот. - person Billy ONeal; 11.05.2011
comment
Я не слежу за тобой, @Billy. Во-первых, вам понадобится функция сравнения, учитывающая обе вещи тогда и только тогда, когда у вас нет стабильной сортировки. В противном случае вы могли бы иметь простую функцию сравнения типа, которая в динамических языках может быть написана в общем виде для сортировки по некоторому свойству по имени. А во-вторых, вам кажется, что есть только один способ составить колоду карт. Уверяю вас, слово «организовать» можно интерпретировать по-разному. - person Ernest Friedman-Hill; 11.05.2011

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

Не обязательно, что нестабильная сортировка является «плохой»; скорее, стабильная сортировка «желательна в некоторых случаях». Вот почему языки программирования, например. В стандартной библиотеке шаблонов C++ есть и то, и другое -- например, std::sort и std::stable_sort -- которые позволяют указать, когда вам нужна стабильность, а когда нет.

person Billy ONeal    schedule 11.05.2011
comment
Не знаю, кто проголосовал против, но я предполагаю, что они сочли ваш пример использования стабильной сортировки для выполнения другой сортировки довольно нетипичным. - person user541686; 14.08.2012
comment
что зависит от идеи, что алгоритм сортировки на основе сравнения, используемый в качестве строительного блока, стабилен - о чем вы говорите? Что такое «строительный блок» поразрядной сортировки и почему он должен быть стабильным? Независимо от того, имеет ли это на самом деле смысл, сортировка не совсем хороший пример того, почему в некоторых случаях желательна стабильная сортировка. - person Bernhard Barker; 01.12.2013
comment
@Dukeling: Потому что сортировка по основанию сортирует каждую цифру в числе (цифры, разделенные основанием, следовательно, сортировка по основанию) и полагается на стабильность базовой сортировки для правильного поведения. (Иначе сортировка по одной цифре может уничтожить результаты сортировки по другой цифре) Что касается не удачного примера, вы имеете право на свое мнение. - person Billy ONeal; 02.12.2013
comment
Ах да, вы упомянули сортировку на основе сравнения, возможно, меня немного сбило с толку. Википедия предлагает сортировку сегментами или сортировку подсчетом, ни одна из которых не основана на сравнении. - person Bernhard Barker; 02.12.2013
comment
+1 Странно, что ваш пример поразрядной сортировки получил отрицательную оценку, когда принятый ответ, получивший большое количество голосов, является просто реальным примером той же концепции. - person Paul Bellora; 02.02.2014

Потому что они могут работать лучше, чем я... от разработчика Слияние:

Существует два вида алгоритмов сортировки: «стабильные сортировки» и «нестабильные сортировки». Эти термины относятся к действию, которое предпринимается, когда два значения сравниваются как равные. Если у вас есть массив T0..size с двумя элементами Tn и Tk для n ‹ k, и эти два элемента при сравнении равны, при стабильной сортировке они появятся в отсортированном выводе со значением, которое было в Tn, предшествующем Tk. Порядок вывода сохраняет исходный порядок ввода. Нестабильная сортировка, напротив, не гарантирует порядок этих двух элементов в выводе.

Обратите внимание, что алгоритмы сортировки, такие как быстрая сортировка, не являются стабильными или нестабильными. Реализация определит, что это такое.

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

person JasCav    schedule 11.05.2011
comment
Я думаю, что ОП понимает, в чем разница между двумя видами сортировок. Он спрашивает, почему нестабильная сортировка будет плохой, что подразумевает, что он (она) знает, что делает сортировку нестабильной. - person Billy ONeal; 11.05.2011
comment
@ Билли - Совершенно верно. Думаю, в целях лучшего ответа я хотел объяснить, что это такое, чтобы затем я мог сказать свой последний абзац: один не обязательно плохой или хороший, кроме как в конкретном случае. - person JasCav; 11.05.2011