Первая проблема в том, что ваш insert
неверен. Просто добавление в конец и вызов heapify(0)
не принесет вам никакой пользы. heapify
собирается исследовать элемент root и его двух дочерних элементов, решить, что root является самым большим элементом, и выйти, ничего не делая. В результате вы просто последовательно добавляете элементы в список.
Чтобы вставить его в мак-кучу, выполните следующие действия:
- Добавьте новый элемент в конец кучи.
- Переместите элемент вверх кучи в правильное положение.
Так что insert
должно выглядеть так:
public void insert(int x) throws Exception {
if(is_full()) {
throw new Exception("The heap is full");
}
// Insert the element at end of Heap
heap_array[n_elems++] = x;
// now sift it up
int current = nelems-1;
int parent = (current-1)/2;
while (current > 0 && heap_array[current] > heap_array[parent]) {
int swap = heap_array[parent];
heap_array[parent] = heap_array[current];
heap_array[current] = swap;
current = parent;
parent = (current-1)/2;
}
}
Я думаю у вас также есть проблема в extract_max
. У вас есть:
int lastElement = heap_array[n_elems];
Но последний элемент фактически имеет индекс n_elems-1]
. Я думаю, вы хотите:
int lastElement = heap_array[n_elems-1];
Это имеет смысл, потому что если n_elems == 1
, то единственным элементом в куче будет root, в heap_array[0]
;