代码拉取完成,页面将自动刷新
package heap
import "gitee.com/guuzaa/algorithm/constraints"
type MinHeap[T constraints.Ordered] struct {
nums []T
length int
}
func NewMinHeap[T constraints.Ordered]() MinHeap[T] {
return MinHeap[T]{make([]T, 0), 0}
}
func (h *MinHeap[T]) Push(val T) {
h.nums = append(h.nums, val)
h.length++
lastParent := parent(h.length)
for i := lastParent; i >= 0; i-- {
moveDown(h.nums, i)
}
}
func (h *MinHeap[T]) Pop() T {
val := h.nums[0]
h.length--
h.nums[0] = h.nums[h.length]
h.nums = h.nums[:h.length]
moveDown(h.nums, 0)
return val
}
func (h *MinHeap[T]) Len() int {
return h.length
}
func (h *MinHeap[T]) IsEmpty() bool {
return h.length == 0
}
func moveDown[T constraints.Ordered](nums []T, parent int) {
last := len(nums) - 1
for {
left, right := leftChild(parent), rightChild(parent)
if left > last {
break
}
child := left
if right <= last && nums[right] < nums[child] {
child = right
}
// ! Note
if nums[parent] > nums[child] {
nums[parent], nums[child] = nums[child], nums[parent]
}
parent = child
}
}
func parent(child int) int {
return child / 2
}
func leftChild(parent int) int {
return (parent * 2) + 1
}
func rightChild(parent int) int {
return (parent + 1) * 2
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。