image.png

1. 堆的概念

堆 - 图3

2. 简单实现

  1. package heap
  2. /**
  3. 使用数组来存储数据
  4. 从下标为 1 的位置开始存数据
  5. 节点:i
  6. 左节点:2 * i
  7. 右节点:2 * i + 1
  8. 父节点:i / 2
  9. */
  10. type Heap struct {
  11. value []int
  12. len int
  13. caps int
  14. }
  15. /**
  16. 放入最后一个可插入的位置
  17. 然后从下往上调整
  18. */
  19. func (h *Heap) Push(v int) {
  20. if h.len == h.caps {
  21. panic("存不下了")
  22. }
  23. h.len++
  24. h.value[h.len] = v
  25. h.up()
  26. }
  27. func (h *Heap) Pop() int {
  28. v := h.value[1]
  29. h.value[1] = h.value[h.len] // 最后一位放到第一
  30. h.len--
  31. h.down()
  32. return v
  33. }
  34. func (h *Heap) up() {
  35. n, i := h.value[h.len], h.len
  36. for n < h.value[i/2] && i > 0 {
  37. h.value[i] = h.value[i/2]
  38. h.value[i/2] = n
  39. i = i / 2
  40. }
  41. }
  42. func (h *Heap) down() {
  43. n, i := h.value[1], 1
  44. for {
  45. i = i * 2
  46. l, r := h.value[i], h.value[i+1]
  47. if l < r {
  48. i++
  49. }
  50. if i > h.len {
  51. break
  52. }
  53. if h.value[i] > n {
  54. h.value[i/2] = h.value[i]
  55. h.value[i] = n
  56. }
  57. }
  58. }