Дайте значения l
и r
внутри цикла while
while index <= len(data) // 2:
l, r = 2 * index, 2 * index + 1
if r >= len(data):
r = index
if data[index] > data[l] or data[index] > data[r]:
min_i = data.index(min(data[l], data[r]))
data[index], data[min_i] = data[min_i], data[index]
count += 1
index = min_i
print(data) #Added this for easy debugging.
return count
И запустить цикл до половины значений только потому, что это двоичная минимальная куча.
Выход:
[0, 7, 100, 8, 9, 22, 45, 12, 16, 27, 36]
[0, 7, 9, 8, 100, 22, 45, 12, 16, 27, 36]
[0, 7, 9, 8, 16, 22, 45, 12, 100, 27, 36]
Binary heap = [0, 7, 9, 8, 16, 22, 45, 12, 100, 27, 36]
Swaps = 3
Пересмотрен алгоритм для тех индексов, чьи дети не существуют.
Для: values = [0, 100, 7, 11, 9, 8, 45, 12, 16, 27, 36]
для 100
после двух перестановок с индексом 5, у которого нет правого потомка, поэтому, когда он превышает длину списка, мы просто возвращаем его к исходному индексу.
Heapified список: Binary heap = [0, 7, 8, 11, 9, 36, 45, 12, 16, 27, 100]
.