栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Golang实现的大顶堆demo

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang实现的大顶堆demo

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 := root
	left := 2 * root
	right := 2*root + 1
	if 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 main

import "fmt"


type Heap struct {
	arr []int
}

func (h *Heap) Size() int {
	return h.arr[0]
}
func (h *Heap) pushDown(root int) {
	t := root
	left := 2 * root
	right := 2*root + 1
	if 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函数的参数为根节点index
	h.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())
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027000.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号