定义
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆节点的访问
通常堆是通过一维数组来实现的。在数组起始位置为0的情形中:
父节点i的左子节点在位置 (2i+1);
父节点i的右子节点在位置 (2i+2);
子节点i的父节点在位置 floor((i-1)/2);
时间复杂度
实现
// HeapSort
package main
import (
"fmt"
)
func maxHeap(start int, end int, c []int) {
var root = start
for true {
var child = 2*root + 1
if child > end {
break
}
if child+1 <= end && c[child] < c[child+1] {
child += 1
}
if c[root] < c[child] {
c[root], c[child] = c[child], c[root]
root = child
} else {
break
}
}
return
}
func heapSort(c []int) []int {
var n = len(c)
for start := n / 2; start >= 0; start-- {
maxHeap(start, n-1, c)
}
for end := n - 1; end > 0; end-- {
c[0], c[end] = c[end], c[0]
maxHeap(0, end-1, c)
}
return c
}
测试
//test
func main() {
var b = []int{9, 8, 6, 7, 4, 3, 2, 1}
fmt.Println(heapSort(b))
}