1.简介

大顶堆的节点的值大于或等于左右子节点的值。

堆通过slice实现并且从索引1处开始存储实际数据则具有如下性质:

其左孩子节点索引值为父亲节点索引值的2倍。

以下代码使用slice实现了大顶堆,使用arr[0]存储堆的大小。其核心代码是堆的上浮和下沉操作。其他插入和弹出操作均依赖于上浮和下沉操作。

1.1上浮

上浮操作主要是将末尾的元素通过迭代的方式依次和其父祖节点比较、交换,直到到达合适位置。具体代码如下:

func (h *Heap) pushUp() {tmp := h.Size()for h.arr[tmp] > h.arr[tmp/2] && tmp > 1 {h.arr[tmp], h.arr[tmp/2] = h.arr[tmp/2], h.arr[tmp]tmp = tmp / 2}
}

1.2下沉

下沉操作主要是将堆顶的元素通过递归的方式依次和其最大的子孙节点比较,交换,直到到达合适位置。具体代码如下:

func (h *Heap) pushDown(root int) {t := rootleft := 2 * rootright := 2*root + 1if right <= h.Size() && h.arr[right] >= h.arr[t] {t = right}if left <= h.Size() && h.arr[left] >= h.arr[t] {t = left}if t != root {h.arr[root], h.arr[t] = h.arr[t], h.arr[root]h.pushDown(t)}
}

1.3完整代码如下:

package mainimport "fmt"/*
use arr[0] storage the heap size
大顶堆
author:MCMAXMM
dateTime:2022-07-24
*/
type Heap struct {arr []int
}func (h *Heap) Size() int {return h.arr[0]
}
func (h *Heap) pushDown(root int) {t := rootleft := 2 * rootright := 2*root + 1if right <= h.Size() && h.arr[right] >= h.arr[t] {t = right}if left <= h.Size() && h.arr[left] >= h.arr[t] {t = left}if t != root {h.arr[root], h.arr[t] = h.arr[t], h.arr[root]h.pushDown(t)}
}//大顶堆
func (h *Heap) pushUp() {tmp := h.Size()for h.arr[tmp] > h.arr[tmp/2] && tmp > 1 {h.arr[tmp], h.arr[tmp/2] = h.arr[tmp/2], h.arr[tmp]tmp = tmp / 2}
}
func (h *Heap) Insert(v int) {
//在末尾添加元素h.arr = append(h.arr, v)h.updateSize(1)h.pushUp()
}
func (h *Heap) PopTop() int {if h.Size() < 1 {return -1}
//保存堆顶元素res := h.arr[1]
//将末尾元素放置到堆顶位置h.arr[1] = h.arr[h.Size()]h.updateSize(-1)
//pushDown函数的参数为根节点indexh.pushDown(1)return res
}
func (h *Heap) updateSize(v int) {h.arr[0] += v
}func NewHeap() *Heap {return &Heap{make([]int, 1)}
}func main() {heap := NewHeap()for i := 0; i < 10; i++ {heap.Insert(i)}fmt.Println(heap.Size())for i := 1; i <= 10; i++ {fmt.Println(heap.PopTop())}
}

Golang实现的大顶堆demo相关推荐

  1. Golang 中的大顶堆或小顶堆

    Golang 中没有提供可直接使用的大顶堆或小顶堆,需要自己去实现 container/heap 包中的 heap.Interface 接口才能实现,具体如下. package mainimport ...

  2. golang实现大顶堆只看这篇文章就够了

    文章目录 前言 正文 golang实现堆的代码 堆排序 总结 前言 通过本篇文章,你将学会: 初始化大顶堆 弹出堆顶元素 往堆中插入元素 堆排序 学习的前提是你已经知道在构建好的堆中调整单个元素的原理 ...

  3. java大顶堆小顶堆使用案例

    使用优先级队列实现大小顶堆 例题: class MedianFinder {PriorityQueue<Integer> left; //创建大顶堆PriorityQueue<Int ...

  4. c语言大顶堆数组维护,图解大顶堆的构建、排序过程

    这两天在复习大顶堆和小顶堆,比起两年前的懵懵懂懂,这次理解起来就容易了一些.又翻看了一下自己之前的笔记数据结构与算法之PHP排序算法(堆排序),发现自己这次查阅资料,和之前的思路不太一样,遂写下这篇笔 ...

  5. 堆排序之 大顶堆和小顶堆 c语言

    百度得到的堆定义如下: 堆的定义如下:n个元素的序列{k1,k2,ki,-,kn}当且仅当满足下关系时,称之为堆. (ki <= k2i,ki <= k2i+1)或者(ki >= k ...

  6. 算法练习day2——190319(大顶堆、冒泡、选择、插入)

    1.实现大顶堆,用于排序 步骤: 从数组一半的位置开始建堆: 不断调整,使最大元素位于顶上 调整的过程:使根.左孩子.右孩子中的最大值位于根位置: 交换顶元素和末位置元素,同时元素个数-1 -1是为了 ...

  7. Java堆排序递归_大顶堆第二弹----堆排序(递归实现)

    1 packagecom.datastruct;2 3 importjava.util.ArrayList;4 importjava.util.Arrays;5 6 public classBigHe ...

  8. Java版大顶堆的实现

    堆的概念 堆是一棵完全二叉树,一般使用数组来存储.通俗来讲堆其实就是利用数组来维护一个完全二叉树. 按照堆的特点可以把堆分为大顶堆和小顶堆 大顶堆:堆的每个结点的值都大于或等于其左右孩子结点的值 小顶 ...

  9. 算法 - 堆排序(大顶堆、小顶堆)

    用的是顺序存储二叉树,也就是数组实现的二叉树,遍历的时候按照的是二叉树的形式 代码实现 package tree;import java.util.Arrays;public class HeapSo ...

最新文章

  1. linux中的ln属性,linux 常用基础命令 ln 详细介绍
  2. GetLocaleInfo和本地化
  3. Android开发--Http操作介绍(一)
  4. Windows平台kafka环境的搭建
  5. 框架应用 : Spring MVC - 开发详述
  6. HDU 2089 不要62 数位DP
  7. java lambda 调用函数_Java lambda函数将如何编译?
  8. P1242 新汉诺塔
  9. android fragment 弹出对话框,Android中使用Dialogfragment显示对话框
  10. android 使用天地图,天地图嵌入到Android手机中
  11. javafx将数据库内容输出到tableview表格
  12. Bugfree 搭建
  13. 最牛ai波士顿动力上台阶_波士顿动力的位置如何使美国成为人工智能的关键参与者...
  14. 中科院分区发布2021年期刊重大调整(生信期刊调整为生物学大类)
  15. coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网
  16. tornado、flask、c++zmq-req-rep记录
  17. 【五步完美整理Windows系统】
  18. HTML5 SVG蝴蝶飞舞动画3D效果
  19. U盘制作成启动盘后容量变小
  20. lone warrior

热门文章

  1. Locust压力测试方法
  2. C++:创建文件进行存数,并且判断最大值
  3. python练习-001
  4. C语言中time函数的定义及用法示例
  5. 正阅读微信小说分销系统-视频教程-3.通知 图文教程
  6. 计算机应用基础准考证打印,3月计算机等级考试准考证打印入口
  7. 剑指 Offer 52. 两个链表的第一个公共节点
  8. css 滚动条样式修改以及动态显示
  9. Unity通过本地时间/网络时间对软件进行限制使用
  10. c语言 单词变复数_德语速记法:巧记名词复数变化