package main
import "fmt"
// heapify maintains the max heap property for subtree rooted at i
func heapify(arr []int, n int, i int) {
largest := i
left := 2*i + 1
right := 2*i + 2
// check if left child exists and is greater than root
if left < n && arr[left] > arr[largest] {
largest = left
}
// check if right child exists and is greater than current largest
if right < n && arr[right] > arr[largest] {
largest = right
}
// if largest is not root, swap and continue heapifying
if largest != i {
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest) // recursive call to fix subtree
}
}
// heapSort sorts the array in ascending order using heap sort
func heapSort(arr []int) {
n := len(arr)
// build max heap
for i := n/2 - 1; i >= 0; i-- {
heapify(arr, n, i) // heapify each non-leaf node
}
// extract elements from heap one by one
for i := n - 1; i > 0; i-- {
arr[0], arr[i] = arr[i], arr[0] // move current root to end
heapify(arr, i, 0) // heapify reduced heap
}
}
func main() {
arr := []int{4, 10, 3, 5, 1}
heapSort(arr)
for i, v := range arr {
if i == len(arr)-1 {
fmt.Print(v)
} else {
fmt.Print(v, ", ")
}
}
fmt.Println()
}
for i := n/2 - 1; i >= 0; i-- { heapify(arr, n, i) }
build max heap by heapifying all non-leaf nodes from bottom up
for i := n - 1; i > 0; i-- { arr[0], arr[i] = arr[i], arr[0]; heapify(arr, i, 0) }
extract max element to end and restore heap for remaining elements
if largest != i { arr[i], arr[largest] = arr[largest], arr[i]; heapify(arr, n, largest) }
swap root with largest child and recursively heapify subtree