对多维数组/切片进行排序

我在 Go 中创建了一个多维数组(切片),如下所示:

var distancematrix [5][5]int

所以它是一个 5*5 的数组/切片。现在我将值插入到这个切片中,以便在某一点:

distancematrix :  [[0 154 12 35 138] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

现在,我想按升序对这个数组进行排序,例如:

sorteddistancematrix :  [[0 12 35  138 154] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]

我试过了,sort.Ints(distancematrix[0])但它抛出一个错误说:

cannot use distancematrix[0] (type [5]int) as type []int in argument to sort.Ints

基本上,我想获取数组中最小的非零值。我怎样才能对这个数组进行排序来实现这一点?


呼唤远方
浏览 145回答 2
2回答

慕容708150

要获得最小的非零元素,您不需要对其进行排序。与仅获取最小的非零元素相比,对数组或切片进行排序是一项相对昂贵的操作。通常要获得最小的非零元素,只需遍历这些值,然后寻找最适合您的值。如果您找到更好的(在您的示例中为较小的非零),请保留并继续。示例实现:func smallestNonZero(s []int) (n int) {&nbsp; &nbsp; for _, v := range s {&nbsp; &nbsp; &nbsp; &nbsp; if v != 0 && (v < n || n == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n = v&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return}注意:0当且仅当传递的切片不包含任何非零元素(即,它要么充满0s ,要么为空,要么为 )时,该函数才会返回nil。如果切片(也)包含负数,此函数也能正常工作。如果您有一个数组而不是一个切片,只需将数组切片(这会产生一个切片),这样您就可以将其传递给上面的函数。使用它:fmt.Println(smallestNonZero([]int{5, 3, 1, 4}))fmt.Println(smallestNonZero([]int{0, 3, 5, 8, 0, 2, 9}))arr := [5]int{0, 154, 12, 35, 138}fmt.Println(smallestNonZero(arr[:]))输出(在Go Playground上试试):1212

月关宝盒

Go 编程语言规范切片表达式切片表达式从字符串、数组、指向数组的指针或切片构造子字符串或切片。有两种变体:一种是指定上下限的简单形式,另一种是同时指定容量范围的完整形式。简单的切片表达式对于字符串、数组、指向数组的指针或切片 a,主要表达式a[low : high]构造一个子串或切片。索引 low 和 high 选择操作数 a 的哪些元素出现在结果中。结果的索引从 0 开始,长度等于高 - 低。对数组进行切片后a := [5]int{1, 2, 3, 4, 5}s := a[1:4]切片 s 的类型为 []int,长度为 3,容量为 4 和元素s[0] == 2s[1] == 3s[2] == 4为方便起见,可以省略任何索引。缺失的低指数默认为零;缺少的高索引默认为切片操作数的长度:a[2:]&nbsp; // same as a[2 : len(a)]a[:3]&nbsp; // same as a[0 : 3]a[:]&nbsp; &nbsp;// same as a[0 : len(a)]如果 a 是指向数组的指针,则 a[low : high] 是 (*a)[low : high] 的简写。要将 type 转换[5]int为 type []int,请对数组进行切片。例如,package mainimport "sort"func main() {&nbsp; &nbsp; var distancematrix [5][5]int&nbsp; &nbsp; sort.Ints(distancematrix[0][:])}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go