原文:http://tianyalong.icu/content.html?id=6
自定义slice排序
只要实现了Len
、Swap
、Less
函数的都可以使用sort.Sort
函数进行排序。
sort.Reverse
就是将原类型的Less函数进行覆盖,从而在排序的时候打到逆序的目的,例如sort.Sort(sort.Reverse(IntSlice))
type Person struct {
name string
age int
}
type plist []Person
func (p plist) Len() int {
return len(p)
}
func (p plist) Less(i, j int) bool {
return p[i].age < p[j].age
}
func (p plist) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
自定义堆排序
堆排序需要实现上面sort的三个函数,同时还需要实现Push
和Pop
函数,因为涉及到扩缩容,会对reflect.SliceHeader
的Len
和cap
做修改,所以为了保障函数外感知,需要传指针。
package main
import(
"fmt"
"container/heap"
)
type Person struct {
name string
age int
}
type plist []Person
func (p plist) Len() int {
return len(p)
}
func (p plist) Less(i, j int) bool {
return p[i].age < p[j].age
}
func (p plist) Swap(i, j int) {
p[i], p[j] = p[j], p[i]
}
func (p *plist) Push(x interface{}) {
t, ok := x.(Person)
if ok != true {
return
}
*p = append(*p, t)
}
func (p *plist) Pop() interface{} {
l := len(*p)
if l == 0 {
return nil
}
x := (*p)[l-1]
*p = (*p)[:l-1]
return x
}
func main(){
p := []Person{}
p = append(p, Person{"tyl", 21})
p = append(p, Person{"ddd", 212})
p = append(p, Person{"www", 22})
pl := plist(p)
heap.Init(&pl)
for len(pl) > 0 {
fmt.Println(heap.Pop(&pl))
}
}