package main import "fmt" func heapify(arr []int, n int, i int) { largest := i l := 2*i + 1 r := 2*i + 2 if l < n && arr[l] > arr[largest] { largest = l } if r < n && arr[r] > arr[largest] { largest = r } if largest != i { arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) } } func heapSort(arr []int) { n := len(arr) for i := n/2 - 1; i >= 0; i-- { heapify(arr, n, i) } for i := n - 1; i >= 0; i-- { arr[0], arr[i] = arr[i], arr[0] heapify(arr, i, 0) } } func main() { arr := []int{4, 10, 3, 5, 1} heapSort(arr) fmt.Println(arr) }
The heap sort algorithm first builds a max heap, then repeatedly swaps the root with the last element and heapifies the reduced heap. This results in a sorted array in ascending order.
Building the heap takes O(n) time, and then removing the largest element n times takes O(n log n) total. So overall time complexity is O(n log n).
func heapify(arr []int, n int, i int) { largest := i l := 2*i + 1 r := 2*i + 2 if l < n && arr[l] > arr[largest] { largest = l } if r < n && arr[r] > arr[largest] { largest = r } if largest != i { arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) } }
The left and right child indices in a zero-based array heap should be 2*i + 1 and 2*i + 2. Using 2*i and 2*i + 1 causes out of range access.
Heap sort is not stable because it swaps elements that may be far apart, which can change the relative order of equal elements.
package main import "fmt" func heapify(arr []int, n int, i int) { largest := i l := 2*i + 1 r := 2*i + 2 if l < n && arr[l] > arr[largest] { largest = l } if r < n && arr[r] > arr[largest] { largest = r } if largest != i { arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) } } func heapSort(arr []int) { n := len(arr) for i := n/2 - 1; i >= 0; i-- { heapify(arr, n, i) } for i := n - 1; i >= 0; i-- { arr[0], arr[i] = arr[i], arr[0] heapify(arr, i, 0) } } func main() { arr := []int{2, 3, 3, 1, 2} heapSort(arr) fmt.Println(arr) }
Heap sort will sort the array in ascending order including duplicates, resulting in [1 2 2 3 3].
