GO|Golang刷题遇到的坑,sort排序相关

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排序相关】

    推荐阅读