package main
import "fmt"
// 堆排序
//算法导论chapter 6
func left(i int) int {
return 2*i
}
func right(i int) int {
return 2*i+1
}
// 维护最大堆性质
func maxHeapify(arr []int, i int, heapSize int) {
l := left(i)
r := right(i)
var largest int
if l < heapSize && arr[l]>arr[i] {
largest = l
} else {
largest = i
}
if r < heapSize && arr[r]>arr[largest] {
largest = r
}
if largest != i {
arr[i], arr[largest] = arr[largest], arr[i]
maxHeapify(arr, largest, heapSize)
}
}
//建堆
func buildMaxHeap(arr []int, heapSize int) {
for i := len(arr)/2; i >= 0; i-- {
maxHeapify(arr,i, heapSize)
}
}
//堆排序
func heapSort(arr []int) {
var heapSize = len(arr)
buildMaxHeap(arr, heapSize)
for i := len(arr)-1; i >= 1; i-- {
arr[0], arr[i] = arr[i], arr[0]
heapSize--
maxHeapify(arr, 0, heapSize)
}
}
func main() {
arr := []int {0,9,2,1,3,8,4,5,7,6}
heapSort(arr)
fmt.Print(arr)
}