Ответ 1
Рассмотрим, что происходит во время раздела для следующего массива пар, где компаратор использует целое число (только). Строка просто там, так что у нас есть два элемента, которые сравниваются как бы равные, но на самом деле различимы.
(4, "first"), (2, ""), (3, ""), (4, "second"), (1, "")
По определению сортировка стабильна, если после сортировки два элемента, которые сравниваются как равные (два 4
s), появляются в том же порядке после этого, как и раньше.
Предположим, что в качестве поворота мы выбираем 3
. Два элемента 4
будет в конечном итоге после него и 1
и 2
, прежде чем он (там немного больше, чем это, я проигнорировал переместив точку опоры, поскольку он уже в правильном положении, но вы скажем, вы понимаете разделение).
Quicksorts вообще не дают никакой конкретной гарантии, что после раздела два 4
будут, и я думаю, что большинство реализаций отменили бы их. Например, если мы используем классический алгоритм разделения Hoare, массив разбивается следующим образом:
(1, ""), (2, ""), (3, ""), (4, "second"), (4, "first")
что нарушает стабильность сортировки.
Поскольку каждый раздел нестабилен, общий вид вряд ли будет.
Как указывает Steve314 в комментарии, сортировка слияния является стабильной при условии, что при слиянии, если вы сталкиваетесь с равными элементами, вы всегда выводите сначала тот, который поступает из "нижней части" двух половин, которые вы объединяете. То есть, каждое слияние должно выглядеть так, где "слева" - это сторона, которая поступает из нижнего уровня в исходном массиве.
while (left not empty and right not empty):
if first_item_on_left <= first_item_on_right:
move one item from left to output
else:
move one item from right to output
move everything from left to output
move everything from right to output
Если <=
были <
, то слияние не было бы стабильным.