直接给出一个接口,满足接口的都可以实现为小顶堆(排序好的完全二叉树),因为接口又涉及到了 sort.Interface,顺便也给出源码。
// src/container/heap/heap.go ---- line 21// The Interface type describes the requirements// for a type using the routines in this package.// Any type that implements it may be used as a// min-heap with the following invariants (established after// Init has been called or if the data is empty or sorted)://// !h.Less(j, i) for 0 <= i < h.Len() and 2*i+1 <= j <= 2*i+2 and j < h.Len()//// Note that Push and Pop in this interface are for package heap's// implementation to call. To add and remove things from the heap,// use heap.Push and heap.Pop.type Interface interface {sort.InterfacePush(x interface{}) // add x as element Len()Pop() interface{} // remove and return element Len() - 1.}// src/sort/sort.go ---- line 11// A type, typically a collection, that satisfies sort.Interface can be// sorted by the routines in this package. The methods require that the// elements of the collection be enumerated by an integer index.type Interface interface {// Len is the number of elements in the collection.Len() int// Less reports whether the element with// index i should sort before the element with index j.Less(i, j int) bool// Swap swaps the elements with indexes i and j.Swap(i, j int)}
除了接口,就只剩下七个神秘函数。对外公开的五个函数都基于剩下两个 private 函数,先分析一下这两个函数
// src/container/heap/heap.go ---- line 90func up(h Interface, j int) {for {i := (j - 1) / 2 // parentif i == j || !h.Less(j, i) {break}h.Swap(i, j)j = i}}func down(h Interface, i0, n int) bool {i := i0for {j1 := 2*i + 1if j1 >= n || j1 < 0 { // j1 < 0 after int overflowbreak}j := j1 // left childif j2 := j1 + 1; j2 < n && h.Less(j2, j1) {j = j2 // = 2*i + 2 // right child}if !h.Less(j, i) {break}h.Swap(i, j)i = j}return i > i0}
