1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
package heap import "sort"
type Interface interface { sort.Interface Push(x interface{}) Pop() interface{} }
func Init(h Interface) { n := h.Len() for i := n/2 - 1; i >= 0; i-- { down(h, i, n) } }
func Push(h Interface, x interface{}) { h.Push(x) up(h, h.Len()-1) }
func Pop(h Interface) interface{} { n := h.Len() - 1 h.Swap(0, n) down(h, 0, n) return h.Pop() }
func Remove(h Interface, i int) interface{} { n := h.Len() - 1 if n != i { h.Swap(i, n) if !down(h, i, n) { up(h, i) } } return h.Pop() }
func Fix(h Interface, i int) { if !down(h, i, h.Len()) { up(h, i) } } func up(h Interface, j int) { for { i := (j - 1) / 2 if i == j || !h.Less(j, i) { break } h.Swap(i, j) j = i } } func down(h Interface, i0, n int) bool { i := i0 for { j1 := 2*i + 1 if j1 >= n || j1 < 0 { break } j := j1 if j2 := j1 + 1; j2 < n && h.Less(j2, j1) { j = j2 } if !h.Less(j, i) { break } h.Swap(i, j) i = j } return i > i0 }
|