go实现最小堆和最大堆
最小堆
一颗二叉树,其中每一个父亲节点都小于等于两个孩子。
最大堆
与最大堆同理,要大于等于
基于最小、最大堆,可以实现堆排序,优先队列。
最小堆代码实现如下:
package main
type Minheap struct {
Arr []int
}
func (c *Minheap) Put(val int) {
c.Arr = append(c.Arr, val)
c.up()
}
func (c *Minheap) Pop() (val int) {
val = c.Arr[0]
c.Arr[0], c.Arr[len(c.Arr)-1] = c.Arr[len(c.Arr)-1], c.Arr[0]
c.Arr = c.Arr[:len(c.Arr) - 1]
c.down()
return
}
func (c *Minheap) IsEmpty() bool {
return len(c.Arr) <= 0
}
func (c *Minheap) up() {
i := len(c.Arr) - 1
for ;i > 0; {
parent := (i-1)/2
if c.Arr[i] < c.Arr[parent] {
c.Arr[i], c.Arr[parent] = c.Arr[parent], c.Arr[i]
i = parent
} else {
break
}
}
}
func (c *Minheap) down() {
i := 0
for ;i<len(c.Arr); {
left, right := 2 * i + 1, 2*i + 2
minidx := -1
if left < len(c.Arr) && right < len(c.Arr) {
if c.Arr[left] <= c.Arr[right] {
minidx = left
} else {
minidx = right
}
} else if left < len(c.Arr) {
minidx = left
} else if right < len(c.Arr) {
minidx = right
} else {
break
}
if c.Arr[minidx] < c.Arr[i] {
c.Arr[minidx], c.Arr[i] = c.Arr[i], c.Arr[minidx]
i = minidx
} else {
break
}
}
}
func main() {
mh := minheap.Minheap{}
mh.Put(10)
mh.Put(16)
mh.Put(4)
mh.Put(5)
mh.Put(9)
mh.Put(3)
mh.Put(2)
mh.Put(12)
for !mh.IsEmpty() {
fmt.Println(mh.Pop())
}
}
最大堆与上同理,你们可以自己修改一下这份代码试试最大堆
posted on 2024-04-15 19:34 lianghucheng 阅读(51) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!