Метод Heapify Down в минимальной куче

В настоящее время пытаюсь понять Min Heap с помощью Repl здесь: https://repl.it/@Stylebender/Minheap#index.js

Минимальная куча имеет емкость 5.

Как только я вставляю 6-й элемент (50), мы меняем местами элементы с индексом 0 и индексом 5 и извлекаем наименьший элемент из кучи, оставляя кучу как:

[ 50, 10, 20, 40, 30]

Мой конкретный запрос касается строк 39-40.

Как вы можете видеть из журнала консоли, при первом вызове методаrickeDown() min (0), представляющий индексную позицию 50, становится leftChild и в конечном итоге меняет местами позиции с индексом 1 со следующим результатом:

[ 50, 10, 20, 40, 30]

Однако при втором вызове методаrickleDown() 50 с индексом 1 занимает позицию rightChild и меняет местами позиции с индексом 4, чтобы сформировать окончательную кучу, как показано ниже:

[ 10, 30, 20, 40, 50]

Может быть, я просто что-то упускаю, но я не уверен, почему min решил стать leftChild при первом запуске и rightChild при втором запуске, так как не будет 50, так как самый большой элемент в куче min каждый раз удовлетворяет обоим циклам For. вызывается метод?


person Mike Chan    schedule 12.08.2020    source источник
comment
Добро пожаловать в Stack Overflow. Пожалуйста, разместите в Вопросе необходимый код, а не просто ссылку на нужный код.   -  person Beta    schedule 12.08.2020


Ответы (1)


В первом вызове мы сравниваем 50, 10 и 20.
min начинается с 0, указывая на то, что 50.
10 меньше 50, поэтому min становится 1.
20 не меньше 10, поэтому min не меняется.
Мы нашли минимум: 10.

Во втором вызове мы сравниваем 50, 40 и 30.
min начинается с 1, указывая на 50.
40 меньше 50, поэтому min становится 3.
30 меньше 40, поэтому min становится 4.
Мы нашли минимум: 30.

Недостаточно найти элемент меньше 50; мы должны найти минимум. Поменять местами 50 и 20 не получится допустимой минимальной кучи.

person Beta    schedule 12.08.2020