Heap Sort
Implementation
package main
import "fmt"
type Heap struct {
arr []int
}
func (mh *Heap) buildHeap() {
idx := (len(mh.arr) - 2) / 2
for i := idx; i >= 0; i-- {
mh.maxHeapify(len(mh.arr), i)
}
}
func (mh *Heap) maxHeapify(size, idx int) {
leftIdx := left(idx)
rightIdx := right(idx)
minIdx := idx
if leftIdx < size && mh.arr[leftIdx] > mh.arr[idx] {
minIdx = leftIdx
}
if rightIdx < size && 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.maxHeapify(size, minIdx)
}
func (mh *Heap) sort() {
mh.buildHeap()
for i := len(mh.arr) - 1; i > 0; i-- {
mh.arr[i], mh.arr[0] = mh.arr[0], mh.arr[i]
mh.maxHeapify(i, 0)
}
}
func newMinHeap(heapArr []int) *Heap {
mh := &Heap{
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{10, 5, 20, 2, 4, 8})
fmt.Println(minHeap.arr)
minHeap.sort()
fmt.Println(minHeap.arr)
}