//heap的接口类:使用时候需要实现它的方法type Interface interface{
sort.Interface
Push(x any)// add x as element Len()Pop() any // remove and return element Len() - 1.}//shifDown()//堆化(heapify):如果一个节点比它的子节点小(最大堆)或者大(最小堆),那么需要将它向下移动funcdown(h Interface, i0, n int)bool{
i := i0
for{
j1 :=2*i +1//获取i这个下标所在节点的left childif j1 >= n || j1 <0{//验证是否超过堆数组范围break}
j := j1
if 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
}//shifUp()//如果一个节点比它的父节点大(最大堆)或者小(最小堆),//那么需要将它同父节点交换位置。这样是这个节点在数组的位置上升。funcup(h Interface, j int){for{
i :=(j -1)/2// floor((i - 1)/2):获取j的父节点//最小堆时,如果夫节点比子节点大,交换;//最大堆时,如果夫节点比子节点小,则交换if i == j ||!h.Less(j, i){break}
h.Swap(i, j)
j = i
}}//初始化时,从上往下堆化处理funcInit(h Interface){// heapify
n := h.Len()for i := n/2-1; i >=0; i--{down(h, i, n)}}//向尾部插入节点funcPush(h Interface, x any){
h.Push(x)//先执行定义的方法up(h, h.Len()-1)//从下而上的排序堆}//返回并删除根节点数据funcPop(h Interface) any {
n := h.Len()-1
h.Swap(0, n)//将根节点与最后一个节点交换down(h,0, n)//堆化处理return h.Pop()}//删除指定节点funcRemove(h Interface, i int) any {
n := h.Len()-1if n != i {
h.Swap(i, n)//将删除的元素和最后一个元素交换if!down(h, i, n){//堆化来修复,但是并不是唯一的情况,可能还需要up来向上修复up(h, i)}}return h.Pop()}