Следующий код написан на python, но я выделю строки, которые делают тяжелую работу, и в процессе, надеюсь, представлю другое решение создания min-heap
heapArray = []
for heapKey in someArray:
insert(heapArray, int(heapKey))
return heapArray;
def insert(heapArray, heapKey):
heapArray.append(heapKey)
index_of_key = len(heapArray)-1
parent_index_of_key = (index_of_heap_key-1)/2
while index_of_key>0:
if(heapKey < heapArray[parent_index_of_key]):
__swap(index_of_key, parent_index_of_key, heapArray)
index_of_key = parent_index_of_key;
parent_index_of_key = (index_of_key-1)/2
else:
break # we have reached the right spot
В приведенном выше примере мы воссоздаем кучу (да, это означает больше памяти, но для иллюстрации это может быть хорошим началом). Когда мы создаем кучу, мы просто проверяем значение вновь вставленного ключа с его родителем (через parent_index_of_key).
Если родительский элемент больше, чем его дочерний элемент, то мы меняем значение и обновляем индексы (как для замененного ключа, так и для его нового родительского элемента). Мы повторяем этот процесс, пока не достигнем вершины кучи или если ключ кучи не может идти дальше по цепочке
Свопы на месте явно более эффективны, но все вышеперечисленное более интуитивно понятно и легко отслеживается. Ясно, что я не буду использовать приведенный выше код, где память является большим ограничением, но рассмотрю его для случаев, когда краткость и ясность кода превышают использование памяти.