package main
import (
"fmt"
"math/rand"
"time"
)
const ( //常量
min, max = 0, 10000000
)
var (
A []int
heap_size int
n int
)
func Parent(i int) int { //求父节点
return (i - 1) / 2
}
func Left(i int) int { //求左节点
return 2*i + 1
}
func Right(i int) int { //求左节点
return 2*i + 2
}
func Init(n int) bool { //初始化切片
if n > 0 {
heap_size = n
rand := rand.New(rand.NewSource(time.Now().UnixNano())) //时间种子
for i := 0; i < n; i++ {
A = append(A, (rand.Intn(max-min) + min)) //生成随机数
}
return true
} else {
return false
}
}
func Max_Heapify(i int) { //维护堆
var largest int
l := Left(i)
r := Right(i)
if l < heap_size && A[l] > A[i] {
largest = l
} else {
largest = i
}
if r < heap_size && A[r] > A[largest] {
largest = r
}
if largest != i {
A[i], A[largest] = A[largest], A[i]
Max_Heapify(largest)
}
}
func Build_Max_Heap() { //建堆
for i := (heap_size - 1) / 2; i >= 0; i-- {
Max_Heapify(i)
}
}
func Heapsort() {
Build_Max_Heap()
for i := heap_size - 1; i >= 1; i-- {
A[0], A[i] = A[i], A[0]
heap_size = heap_size - 1
Max_Heapify(0)
}
}
func main() {
fmt.Println("请输入元素的个数:")
fmt.Scanln(&n)
if Init(n) {
t1 := time.Now()
Heapsort()
elapsed := time.Since(t1)
fmt.Println("运行时间: ", elapsed)
//fmt.Println(A)
} else {
fmt.Println("你输入的数据存在错误\a")
}
}
Go实现堆排序
最新推荐文章于 2024-05-08 10:25:17 发布