package main
func main() {
A := []int{3, 6, 9, 7, 8, 4, 2, 10}
fmt.Println(A)
HeapSort(A)
fmt.Println(A)
}
func Parent(i int) int {
return (i - 1) / 2
}
func Left(i int) int {
return 2*i + 1
}
func Right(i int) int {
return 2*i + 2
}
func MaxHeapify(A []int, i, heapsize int) {
largest := i
l := Left(i)
r := Right(i)
if l < heapsize && A[l] > A[largest] {
largest = l
}
if r < heapsize && A[r] > A[largest] {
largest = r
}
if i != largest {
A[i], A[largest] = A[largest], A[i]
MaxHeapify(A, largest, heapsize)
}
}
func BuildMaxHeap(A []int) {
heapsize := len(A)
last := len(A) - 1
p := Parent(last)
for i := p; i >= 0; i-- {
MaxHeapify(A, i, heapsize)
}
}
func HeapSort(A []int) {
BuildMaxHeap(A)
heapsize := len(A)
last := len(A) - 1
for i := last; i > 0; i-- {
A[i], A[0] = A[0], A[i]
heapsize--
MaxHeapify(A, 0, heapsize)
}
}