在每一种编程语言中,都会涉及到排序操作。而在Go语言中,其中内置的 sort 包中提供了根据一些排序函数来对任何序列进行排序的功能。通过这个包中的一些方法,我们可以对一些基本的可以比较大小的类型的切片进行排序,也可以通过实现排序接口的几个特定方法实现自定义排序。
sort.Ints()、sort.Strings()
- sort.Ints --针对整型
- sort.Strings --字符串
默认从小到大
例如
package main
import (
"fmt"
"sort"
)
func main() {
s := []int{4, 2, 3, 1}
sort.Ints(s)
fmt.Println(s)
str := []string{"ddd", "bbb", "ccc"}
sort.Strings(str)
fmt.Println(str)
}
sort.Slice()
Go 1.8之后的版本,在 sort 包中提供了 sort.Slice() ,它使用一个用户提供的函数来对序列进行排序,函数类型为 func(i, j int) bool
,其中参数 i, j 是序列中的索引。与C++中的自定义排序有些类似:
bool cmd(Student a, Student b) {
if (a.age < b.age)
return true;
return false;
}
此排序不能保证是稳定的:相等的元素可能会从它们的原始顺序颠倒过来。
例如:
package main
import (
"fmt"
"sort"
)
func main() {
Student := []struct {
Name string
Age int
}{
{"zhangsan", 23},
{"wangwu", 2},
{"lili", 18},
{"lisi", 2},
}
sort.Slice(Student, func(i, j int) bool {
return Student[i].Age < Student[j].Age
})
fmt.Println(Student)
}
sort.SliceStable()
在排序切片时会保留相等元素的原始顺序。
例如:
package main
import (
"fmt"
"sort"
)
func main() {
Student := []struct {
Name string
Age int
}{
{"zhangsan", 23},
{"wangwu", 2},
{"lili", 18},
{"lisi", 2},
}
// 用 age 排序,年龄相等的元素保持原始顺序
sort.SliceStable(Student, func(i, j int) bool {
return Student[i].Age < Student[j].Age
})
fmt.Println(Student)
sort.SliceStable(Student, func(i, j int) bool {
return Student[i].Age > Student[j].Age
})
fmt.Println(Student)
sort.Slice(Student, func(i, j int) bool {
return Student[i].Age < Student[j].Age
})
fmt.Println(Student)
}
sort.Search()
语法
index := sort.Search(n int,f func(i int) bool) int
该函数使用二分查找的方法,会从[0, n)中取出一个值index,index为[0, n)中最小的使函数f(index)为True的值,并且f(index+1)也为True。如果无法找到该index值,则该方法为返回n。
实例
在数组中,找到第一个大于3的下标。
package main
import (
"fmt"
"sort"
)
func main() {
a := []int{1, 2, 3, 4, 5}
d := sort.Search(len(a), func(i int) bool { return a[i] >= 3 })
fmt.Println(d)
}
标签:sort,包中,Search,func,int,fmt,Student,Age
From: https://blog.csdn.net/m0_73537205/article/details/140243001