Golang的sort包提供了强大的切片排序功能,sort.Ints可以直接对int切片排序,sort.Slice可以自定义比较函数对任意切片排序,sort.Sort可以通过实现Len,Less,Swap三个接口实现更底层的自定义排序。一般来说使用sort.Slice就足够了。比如这一题,国王游戏,https://www.luogu.com.cn/problem/P1080,虽然难点在高精度,但高精度之前要根据大臣左右手值的乘积进行排序。本题可以将国王和大臣保存在一个二维切片中,切片每个元素存左手,右手,左右手乘积,因为只有大臣参与排序,所以sort可以这样做
sort.Slice(pr[1:], func(i, j int) bool {
return pr[i][2] < pr[j][2]
})
这里其实已经犯了错了。比如如下数据
3
1 1
2 3
7 4
4 6
排序前数组是这样的
[[1 1 1] [2 3 6] [7 4 28] [4 6 24]]
按上面的排序定义后,排序后是这样的
[[1 1 1] [2 3 6] [7 4 28] [4 6 24]]
排序其实失败了,问题就出在sort.Slice(pr[1:],)这里,第一个参数如果写成部分切片的形式,则自定的sort函数也需要修改下标,不然调用底层快速排序下标会混乱。
pr = pr[1:]
sort.Slice(pr, func(i, j int) bool {
return pr[i+1][2] < pr[j+1][2]
})
【GO|Golang刷题遇到的坑,sort排序相关】
推荐阅读
- Go|Docker后端部署详解(Go+Nginx)
- GO|GO,GO,GO!
- leetcode刷题|【leetcode每日刷题】35. Search Insert Position
- Go成长之路|go中判断空字符串、nil和len(t)的用法
- leetcode 第35题 搜索插入位置
- 数组(简单题)(搜索插入位置)
- 搜索插入位置(Search Insert Position)
- go编译tools
- go grpc安装与使用