核心代码
package lib
var nums []int
func HeapSort(numsArray []int) []int {
nums = numsArray
heapSize := len(nums)
for heapSize > 1 {
//建堆空间
buildHeep(heapSize)
//交换排序后的堆顶和最后一个堆元素
swap(&nums[0], &nums[heapSize-1])
//堆空间减1
heapSize--
}
return nums
}
func swap(a, b *int) {
*a, *b = *b, *a
}
func buildHeep(len int) {
// 找到最后一个节点的父节点
parent := len/2 - 1
for parent >= 0 {
heapify(parent, len)
parent--
}
}
func heapify(parent, len int) {
// 判断两个子节点是否比父节点大,如果子节点大则交换子节点和父节点
max := parent
lson := parent*2 + 1
rson := parent*2 + 2
if lson < len && nums[lson] > nums[max] {
// 左节点是否大于父节点
max = lson
}
if rson < len && nums[rson] > nums[max] {
// 右节点是否大于父节点
max = rson
}
if parent != max {
swap(&nums[max], &nums[parent])
heapify(max, len)
}
}
调用入口
package main
import (
"fmt"
"test/lib"
)
func main() {
fmt.Println(lib.HeapSort([]int{
4, 3, 5, 0, 8, 6, 7,
}))
}
网友评论