我尝试修改标准排序方法,并在排序 Less 界面中添加一定的随机性。什么时候if (u[i] - u[j]) <= 0或者if u[i] < u[j]它按预期工作但是if (u[i] - u[j]) <= rvpanic: runtime error: index out of rangegoroutine 1 [running]:panic(0x176ba0, 0x1040a010) /usr/local/go/src/runtime/panic.go:464 +0x700main.FuzzySorter.Less(0x10456000, 0x9f, 0x9f, 0x19, 0xffffffff, 0x4, 0x1, 0xd) /tmp/sandbox201242525/main.go:21 +0x140main.(*FuzzySorter).Less(0x10434140, 0x19, 0xffffffff, 0x5c, 0x1, 0x10434140) <autogenerated>:3 +0xc0sort.doPivot(0xfef741b0, 0x10434140, 0x19, 0x9f, 0x7, 0x19) /usr/local/go/src/sort/sort.go:128 +0x280sort.quickSort(0xfef741b0, 0x10434140, 0x19, 0x9f, 0xe, 0xfef741b0) /usr/local/go/src/sort/sort.go:195 +0xa0sort.Sort(0xfef741b0, 0x10434140) /usr/local/go/src/sort/sort.go:229 +0x80main.FuzzySorter.Sort(0x10456000, 0x9f, 0x9f, 0x1, 0x0, 0x0, 0x0, 0x1777a0) /tmp/sandbox201242525/main.go:29 +0xa0main.main() /tmp/sandbox201242525/main.go:195 +0xc0
2 回答

慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
从 Go 1.8 开始,有一种更简单的方法可以对切片进行排序,而无需您定义新类型。您只需创建一个 Less(匿名)lambda。
a := []int{5, 3, 4, 7, 8, 9}
sort.Slice(a, func(i, j int) bool {
return a[i] < a[j]
})
for _, v := range a {
fmt.Println(v)
}
这将按升序排序,如果你想要相反的,只需写 a[i] < a[j]

天涯尽头无女友
TA贡献1831条经验 获得超9个赞
据我所知,Go 排序实现需要两个负面比较,例如。Less(i, j)并且Less(j, i)两者都返回 false,它将其视为相等,但不是正数。例如Less(i, j),Less(j, i)不能都返回真。因此,您可以轻松地以逻辑正确和确定性的方式获得所需的结果,只需
if (u[i] - u[j]) < -1 {
return true
} else {
return false
}
https://play.golang.org/p/VcKI9uzcM9
- 2 回答
- 0 关注
- 276 浏览
添加回答
举报
0/150
提交
取消