一、堆的实现
package main
import (
"container/heap"
"fmt"
"math/rand"
"time"
)
type Girl struct {
name string
age int
tall int
beauty int
}
type GirlHeap []Girl
//比大小
func (h *GirlHeap) Less(i, j int) bool {
//return (*h)[i].age > (*h)[j].age //对比年龄
//return (*h)[i].tall < (*h)[j].tall
return (*h)[i].beauty < (*h)[j].beauty
}
//交换
func (h *GirlHeap) Swap(i, j int) {
(*h)[i], (*h)[j] = (*h)[j], (*h)[i]
}
//取得长度
func (h *GirlHeap) Len() int {
return len(*h)
}
//弹出
func (h *GirlHeap) Pop() (v interface{}) {
*h, v = (*h)[:h.Len()-1], (*h)[h.Len()-1]
return
}
//压入
func (h *GirlHeap) Push(v interface{}) {
*h = append(*h, v.(Girl))
}
//删除
func (h *GirlHeap) Remove(idx int) interface{} {
h.Swap(idx, h.Len() - 1)
return h.Pop()
}
func main(){
h:=new(GirlHeap)
rand.Seed(time.Now().UnixNano())
for i:=0;i<10;i++{
h.Push(Girl{fmt.Sprintf("妹子%d",i),rand.Intn(30)+18,150+rand.Intn(30),rand.Intn(100)})
}
fmt.Println(h)
for i:=0;i<10;i++{
heap.Init(h) //取得极值一次,堆排序算法,
fmt.Println(h)
h.Swap(0,h.Len()-1)
fmt.Println(h.Pop())
}
}