1,slice(切片)排序
- 这个直接看就好了
int类型排序
s := []int{3,2,4,1}
sort.Ints(s)
fmt.Println(s) // [1,2,3,4]
string类型排序
s := []string{"Go", "Bravo", "Gopher", "Alpha", "Grin", "Delta"}
sort.Strings(s)
fmt.Println(s) // [Alpha Bravo Delta Go Gopher Grin]
float类型排序
s := []float64{5.2, -1.3, 0.7, -3.8, 2.6}
sort.Float64s(s)
fmt.Println(s) // [-3.8,-1.3,0.7,2.6,5.2]
2, 对结构体进行排序
-
前提:要想对某个类型排序,首先要这个类型实现Swap len less 三个方法,ps:通常只要自己定义Less方法,另外两个不需要动
-
思路:构建一个类型,同时定义一个切片,以需要排序的类型为element,实现以上三个方法,然后根据业务逻辑对Less函数进行修改定制
type Person struct { Name string Age int } type byAge []Person func (a ByAge) Len() int { return len(a) } func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age } func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func main() { family := []Person{ {"Alice", 23}, {"Eve", 2}, {"Bob", 25}, } sort.Sort(ByAge(family)) fmt.Println(family) // [{Eve 2} {Alice 23} {Bob 25}] }
3,map排序
- 思路: 要对golang map按照value进行排序,思路是直接不用map,用struct存放key和value,实现sort接口,就可以调用sort.Sort进行排序了
- sort.Reverse是提供倒序排序
- 如果需要对key排序,则只需要修改Less函数即可
type Pair struct {
Key string
Value int
}
type PairList []Pair
func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p PairList) Len() int { return len(p) }
func (p PairList) Less(i, j int) bool { return p[i].Value < p[j].Value }
// A function to turn a map into a PairList, then sort and return it.
func sortMapByValue(m map[string]int) PairList {
p := make(PairList, len(m))
i := 0
for k, v := range m {
p[i] = Pair{k, v}
i++
}
sort.Sort(sort.Reverse(p)) // sort.Reverse是提供倒序排序
return p
}
4,sort.Sort函数解析
- 该包实现了四种基本排序算法:插入排序、归并排序、堆排序和快速排序。 但是这四种排序方法是不公开的,它们只被用于sort包内部使用。所以在对数据集合排序时不必考虑应当选择哪一种排序方法,只要实现了sort.Interface定义的三个方法:获取数据集合长度的Len()方法、比较两个元素大小的Less()方法-平时自定义排序的时主要就是修改这个函数 和交换两个元素位置的Swap()方法,就可以顺利对数据集合进行排序。sort包会根据实际数据自动选择高效的排序算法。
文章参考链接如下:
https://golang.org/pkg/sort/#Reverse
https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter03/03.1.html