Skip to content

Build Heap

Implementation

package main

import "fmt"

type MinHeap struct {
    arr []int
}

func (mh *MinHeap) buildHeap() {
    idx := (len(mh.arr) - 2) / 2
    for i := idx; i >= 0; i-- {
        mh.heapify(i)
    }
}

func (mh *MinHeap) heapify(idx int) {
    leftIdx := left(idx)
    rightIdx := right(idx)
    minIdx := idx
    if leftIdx < len(mh.arr) && mh.arr[leftIdx] < mh.arr[idx] {
        minIdx = leftIdx
    }
    if rightIdx < len(mh.arr) && mh.arr[rightIdx] < mh.arr[minIdx] {
        minIdx = rightIdx
    }
    if minIdx == idx {
        return
    }
    mh.arr[minIdx], mh.arr[idx] = mh.arr[idx], mh.arr[minIdx]
    mh.heapify(minIdx)
}

func newMinHeap(heapArr []int) *MinHeap {
    mh := &MinHeap{
        arr: make([]int, len(heapArr)),
    }
    copy(mh.arr, heapArr)

    return mh
}

func left(i int) int {
    return 2*i + 1
}

func right(i int) int {
    return 2*i + 2
}


func main() {
    minHeap := newMinHeap([]int{10, 5, 20, 2, 4, 8})
    fmt.Println(minHeap.arr)
    minHeap.buildHeap()
    fmt.Println(minHeap.arr)
}