📌  相关文章
📜  如何在 Golang 中对搜索的切片进行排序?

📅  最后修改于: 2021-10-24 14:24:09             🧑  作者: Mango

Go 语言提供了基本常量的内置支持实现和运行时反射来操作排序包。 Golang 具有让函数彼此独立运行的能力。借助这个函数,我们可以通过导入“sort”包轻松地对整数和字符串进行排序。这些函数是在sort包下定义的,所以你需要在你的程序中导入sort包。 sort函数可以搜索任何重要的 Golang 排序函数列表,如下所示:

句法:

func Search(n int, f func(int) bool) int

返回值:该函数返回 [0, n) 中 f(i) 为真的最小索引 i,假设在 [0, n) 范围内,f(i) == true 意味着 f(i+1) == 真的。

此函数仅用于对 Search 的切片进行排序。下面的例子说明了上述方法在 Golang 中的使用:

示例 1:

package main
  
import (
    "fmt"
    "sort"
)
  
func main() {
  
    // integer slice in unsort order
    intSlice := []int{10, 3, 6, 10, 15, 21, 38, 26, 25, 45}
    a := 15
    pos := sort.SearchInts(intSlice, a)
    fmt.Printf("Found %d at index %d in %v\n", a, pos, intSlice)
  
    // string slice in unsorted order
    strSlice := []string{"Pink", "Orange", 
                         "Green", "Black", 
                  "Purple", "Blue", "Red"}
      
    b := "Green"
    pos = sort.SearchStrings(strSlice, b)
    fmt.Printf("Found %s at index %d in %v\n",
                             b, pos, strSlice)
  
    // string slice in unsorted order
    fltSlice := []float64{612.15, 114.510,
               211.144, 396.242, 485.143}
      
    c := 211.144
    pos = sort.SearchFloat64s(fltSlice, c)
    fmt.Printf("Found %f at index %d in %v\n",
                            c, pos, fltSlice)
  
    // sorted slice in descending
    d := []int{45, 38, 26, 25, 21, 15, 10, 10, 6, 3}
    e := 38
    i := sort.Search(len(d), func(i int) bool { return d[i] <= e })
      
    if i < len(d) && d[i] == e {
        fmt.Printf("found %d at index %d in %v\n", e, i, d)
    } else {
        fmt.Printf("%d not found in %v\n", e, d)
    }
}

输出:

Found 15 at index 4 in [10 3 6 10 15 21 38 26 25 45]
Found Green at index 6 in [Pink Orange Green Black Purple Blue Red]
Found 211.144000 at index 2 in [612.15 114.51 211.144 396.242 485.143]
found 38 at index 1 in [45 38 26 25 21 15 10 10 6 3]

示例 2:给定示例说明搜索以不同形式按升序排序的列表。

package main
  
import (
    "fmt"
    "sort"
)
  
func main() {
  
    // unsorted
    s := []int{19, 42, 24, 63, -20, 59}
    sort.Sort(sort.IntSlice(s))
  
    // sorted
    fmt.Println(s)
    fmt.Println("Length of Slice: ", sort.IntSlice.Len(s))
  
    fmt.Println("40 found in Slice at position: ",
        sort.IntSlice(s).Search(40))
  
    fmt.Println("-10 found in Slice at position: ",
        sort.IntSlice(s).Search(6))
    fmt.Println("-----------------------------------")
  
    t := []string{"Pink", "Orange", "Green",
        "Black", "Purple", "Blue", "Red"}
  
    sort.Sort(sort.StringSlice(t))
  
    fmt.Println(t)
    fmt.Println("Length of Slice: ", sort.StringSlice.Len(t))
  
    fmt.Println("Black found in Slice at position: ",
        sort.StringSlice(t).Search("Black"))
  
    fmt.Println("Orange found in Slice at position: ",
        sort.StringSlice(t).Search("Orange"))
  
    fmt.Println("-----------------------------------")
  
    // unsorted
    u := []float64{602.15, 194.10, 611.144, 396.42, 655.433}
    sort.Sort(sort.Float64Slice(u))
  
    // sorted
    fmt.Println(u)
    fmt.Println("Length of Slice: ", sort.Float64Slice.Len(u))
  
    fmt.Println("611.144 found in Slice at position: ",
        sort.Float64Slice(u).Search(611.144))
  
    fmt.Println("194.10 found in Slice at position: ",
        sort.Float64Slice(u).Search(194.10))
}

输出:

[-20 19 24 42 59 63]
Length of Slice:  6
40 found in Slice at position:  3
-10 found in Slice at position:  1
-----------------------------------
[Black Blue Green Orange Pink Purple Red]
Length of Slice:  7
Black found in Slice at position:  0
Orange found in Slice at position:  3
-----------------------------------
[194.1 396.42 602.15 611.144 655.433]
Length of Slice:  5
611.144 found in Slice at position:  3
194.10 found in Slice at position:  0