У меня есть вопрос о heapsort и о куче, участвующей в этом.разъяснения алгоритма гепсорта при фактической сортировке
при построении meax-кучи из массива, на самом деле вы создаете что кучного автономный объект, или просто организовать массив, чтобы следующий алгоритм, чтобы построить кучу, чтобы построить из этого макс кучи ?
после того, как вы измените массив в порядке, который представляет собой максимальную кучу, вы хотите отсортировать этот массив или создать другой массив, отсортированный по элементам этого массива.
Алгоритм сделать это:
А - это пример массива: {5, 3, 17, 10, 19,84, 6, 22, 9}
пирамидальной сортировки (A)
1 BUILD-MAX-HEAP(A)
// here you rearrange the array to represent a max heap or
you actually construct a maxheap from that?
//a max heap array representation will be:
{84, 22, 17, 10, 19, 5, 6, 3, 9}
2 for i = A.length downto 2{
3 exchange A[1] with A[i];
4 A.heap-size = A.heap-size - 1; -- what this do in fact?
5 MAX-HEAPIFY(A, 1);
}
с моей точки зрения, кажется, на самом деле создать кучу массива размера (макс-кучу на самом деле). Затем на том, что делается на самом деле итерация, по-видимому, находится над массивом и MAX-HEAPIFY - теперь как-то на вскрикнувшей куче.
Можете ли вы разъяснить мне эти вещи шаг за шагом?
(1) зависит от реализации - вы можете вероятно, найдет там код, который принимает либо подход, либо даже что-то еще ... (2) после того, как у вас есть максимальная куча, вы можете извлечь элементы в отсортированном порядке из-за определенных свойств max-heap - нет необходимости в другой сортировочный проход, поскольку элементы были отсортированы в процессе построения кучи. – twalberg
Привет, спасибо за ответ. В Max heap элементы не отсортированы по порядку. Максимальная куча гарантирует, что корень каждого дерева или поддерева является самым большим. Это не означает, что дети сортируются, как в BST. – DanutClapa
Нет, сами элементы не находятся в полностью отсортированном порядке. Однако с использованием вспомогательной структуры данных (например, очереди приоритетов) вы можете извлечь узлы по порядку с максимальной кучи. Добавьте всю кучу в очередь, затем итеративно удалите элемент из очереди, распечатайте его и добавьте все его дочерние объекты в порядке очередности в очередь - это приводит к тому, что вы всегда извлекаете следующий самый большой элемент ... – twalberg