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   lianghucheng  阅读(51)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示