Похоже, вы пытаетесь построить максимальную кучу с корнем в A[0]
.Если это так, то ваши вычисления индекса left
, right
и parent
неверны.У вас есть:
def parent(self, i):
"""
returns the parent index
"""
i+=1
i = int(i/2)
return i
def left(self, i):
"""
returns the index of left child
"""
i = i+1
i = 2*i
return i
def right(self, i):
"""
returns the index of right child
"""
i+=1;
i = 2*i + 1
return i
Так что если i=0
, левый ребенок будет 2, а правый ребенок будет 3. Хуже, если i=3
, parent
вернется 2. Таким образом, у вас естьслучай, когда parent(right(i)) != i
.Это никогда не сработает.
Правильные расчеты:
left = (2*i)+1
right = (2*i)+2
parent = (i-1)/2
Я не знаю, почему ваш extractMax
звонит max(self.A)
.Вы уже знаете, что максимальный элемент в A[0]
.Чтобы извлечь максимальный элемент, все, что вам нужно сделать, это:
returnValue = save value at self.A[0]
take last item in the array and place at self.A[0]
decrease length of array
maxHeapify(0)
Я использовал псевдокод, потому что мне не очень удобно с Python.
Цикл внутри вашего *Метод 1025 * серьезно неоптимальный.Вы звоните self.build_max_heap
на каждой итерации.Вам не нужно это делать.Если extractMax
работает правильно, все, что вам нужно сделать, это:
while self.heap_size() > 0:
temp = self.extractMax()
print temp
Теперь, если вы хотите отсортировать массив на месте, так что сам self.A
будет отсортирован, это немного большесложно.Но, похоже, это не то, что вы пытаетесь сделать.