Skip to content

Heap

package main

import "fmt"

type MinHeap struct {
    arr []int
}

func (mh *MinHeap) insert(ele int) bool {

    mh.arr = append(mh.arr, ele)
    i := len(mh.arr) - 1
    for i > 0 && mh.arr[parent(i)] > mh.arr[i] {
        mh.arr[parent(i)], mh.arr[i] = mh.arr[i], mh.arr[parent(i)]
        i = parent(i)
    }

    return true
}

func (mh *MinHeap) minExtract() *int {
    if len(mh.arr) == 0 {
        return nil
    }
    if len(mh.arr) == 1 {
        val := mh.arr[0]
        mh.arr = []int{}
        return &val
    }
    val := mh.arr[0]
    lastIdx := len(mh.arr) - 1
    mh.arr[lastIdx], mh.arr[0] = mh.arr[0], mh.arr[lastIdx]
    mh.arr = mh.arr[:lastIdx]
    mh.heapify(0)
    return &val
}

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 parent(i int) int {
    return (i - 1) / 2
}

func main() {
    minHeap := newMinHeap([]int{20, 25, 30, 35, 40, 80, 32, 100, 70, 60})
    fmt.Println(minHeap.arr)
    fmt.Println(minHeap.minExtract())
    fmt.Println(minHeap.arr)
}