美文网首页
go 实现堆的相关操作

go 实现堆的相关操作

作者: dwq1666666 | 来源:发表于2021-04-22 10:54 被阅读0次
    package main
    
    type Node struct {
        Value int
    }
    
    type Heap struct {
        list   []*Node
        length int
    }
    
    /**
     [ 将节点插入到堆 ]
     */
    func (h *Heap)InsertNode(node *Node)  {
        h.list = append(h.list, node)
        h.length++
    
        // 自下而上调整堆, 借助堆的特性
        // 自下向上调整能保证整个堆是上一层比下一层大
        deep := h.length/2-1
        for i:=deep; i>=0; i-- {
            leftIndex := i*2+1
            rightIndex := i*2+2
    
            maxIndex := i   // 假设当前为最大
            if leftIndex < h.length && h.list[leftIndex].Value > h.list[i].Value {
                maxIndex = leftIndex
            }
    
            if rightIndex < h.length && h.list[rightIndex].Value > h.list[i].Value {
                maxIndex = rightIndex
            }
    
            if maxIndex != i {
                // 交换位置
                h.list[maxIndex], h.list[i] = h.list[i], h.list[maxIndex]
            } else {
                break
            }
        }
    }
    
    /**
    [ 打印堆里面的数据 ]
     */
    func (h *Heap) PrintHeap()  {
    
        println()
        for _,v := range h.list {
            print(v.Value)
            print(" ")
        }
        println()
    }
    
    /*
    [ 获取最大的一个堆顶元素 ]
     */
    func (h *Heap) GetTop() *Node {
        if h.length==0 {
            return nil
        }
    
        node := h.list[0]
        h.list = h.list[1:] // 将最后 一个元素提到 堆顶
    
        h.length --
    
        // 自上而下调整整个堆,借助堆的特性
        deep := h.length/2-1
        for i:=0; i<=deep; i++ {
            leftIndex := i*2+1
            rightIndex := i*2+2
    
            maxIndex := i   // 假设当前为最大
            if leftIndex < h.length && h.list[leftIndex].Value > h.list[i].Value {
                maxIndex = leftIndex
            }
    
            if rightIndex < h.length && h.list[rightIndex].Value > h.list[i].Value {
                maxIndex = rightIndex
            }
    
            if maxIndex != i {
                // 交换位置
                h.list[maxIndex], h.list[i] = h.list[i], h.list[maxIndex]
            } else {
                // 位置没动说明已经调整到合适的位置了
                break
            }
        }
    
        return node
    }
    
    func main()  {
        // 初始化堆
        arrList := []int{1, 2, 11, 3, 7, 8, 4, 5}
        myHeap := &Heap{}
    
        // 将数据插入堆
        for _, value := range arrList {
            // 插入节点
            myHeap.InsertNode(&Node{value})
        }
    
        // 打印堆里面的所有数据
        myHeap.PrintHeap()
    
        // println(myHeap.length)
    
        // 取出堆里面的数据
        for true {
            currentNode := myHeap.GetTop()
            if currentNode == nil {
                break
            } else {
                println(currentNode.Value)
            }
        }
    
    }
    
    
    

    相关文章

      网友评论

          本文标题:go 实现堆的相关操作

          本文链接:https://www.haomeiwen.com/subject/mkuxrltx.html