Почему не heapsort как стабильный?

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

Я понимаю важность стабильной сортировки-это позволяет сортировать на основе более чем одного ключа, что может быть очень полезно (т. е. делать несколько сортировок, каждый из которых основан на другом ключе. Поскольку каждая сортировка сохранит относительный порядок элементов, предыдущие сортировки могут добавить окончательный список элементов, отсортированных по нескольким критерии.) Однако, почему бы heapsort как сохранить это?

Спасибо за вашу помощь!

5 ответов


конечная последовательность результатов из heapsort происходит от удаления элементов из созданной кучи в порядке чисто размера (на основе ключевого поля).

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


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

рассмотреть массив 21 20a 20b 12 11 8 7 (уже в формате max-heap)

здесь 20a = 20b просто чтобы дифференцировать порядок, мы представляем их как 20a и 20b

в то время как heapsort первый 21 удаляется и помещается в последний индекс, затем 20a удаляется и помещается в последний индекс и 20b в последнем, кроме двух индексов, поэтому после сортировки кучи массив выглядит как

7 8 11 12 20b 20a 21.

это не сохранить порядок элементов, и, следовательно, не может быть стабильным


Stable означает, что если два элемента имеют один и тот же ключ, они остаются в том же порядке или позициях. Но это не относится к сортировке кучи.

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

с здесь:

при сортировке (в порядке возрастания) heapsort сначала достигает наибольшего элемент и поместите его в последний из списка. Итак, элемент, который имеет было выбрано первым, остается последним и элемент, который был выбран второй остается до Второго последнего элемента в отсортированном списке.

опять же, процедура Build-Max-Heap работает так, что она сохраняет порядок того же значения (например:3a,3b) при построении дерева кучи. Для извлечения максимальный элемент он также работает от корня и пытается сохранить структура дерева (за исключением изменения для Heapify).

Итак, что происходит для элементов с одинаковым значением [3a, 3b] heapsort как кирки 3a перед 3b, но ставит 3a справа от 3b. Итак, как список сортировка в порядке возрастания мы получаем 3b до 3a в списке .

Если вы попробуете heapsort с (3a,3b, 3b), то вы можете визуализировать ситуация.


предположим, возьмем массив размера n (произвольное значение) и если в куче есть два последовательных элемента(предположим, 15) и если их родительские индексы имеют значения 4 и 20.(это фактический порядок (....4,20 ,.....,15,15.....). относительный порядок 4 и 1st 15 остается тем же,но как 20>15, 2nd 15 выходит на передний план(своп), как определено в алгоритме сортировки кучи, относительный порядок исчез.


Я знаю, что это поздние ответы, но я добавлю свои 2 цента здесь. Рассмотрим простой массив из 3 целых чисел. 2,2,2 теперь, если вы создадите максимальную кучу с помощью функции build max heap, вы обнаружите, что массив, хранящий входные данные, не изменился, поскольку он уже находится в форме Max heap. Теперь, когда мы помещаем корень дерева в конец массива на первой итерации сортировки кучи, стабильность массива уже исчезла. Итак, у вас есть простой пример нестабильности сортировки кучи.