用Golang在一个自定义结构体切片上执行二分查找的程序

用Golang在一个自定义结构体切片上执行二分查找的程序

二分查找是一种高效的查找算法,应用广泛。这里讲解如何在Golang中,在一个自定义结构体切片中执行二分查找。

自定义结构体

假设我们有这样一个自定义结构体:

type Person struct {
    Name string
    Age int
}

这个结构体有两个字段,分别是“Name”和“Age”。

切片排序

我们需要对切片进行排序以便于执行二分查找。Golang的标准库中提供了用于排序切片的函数“sort.Slice”。

var people = []Person{
    {"Alice", 30},
    {"Bob", 20},
    {"Carl", 40},
    {"David", 25},
}

sort.Slice(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})

这里我们定义了一个包含四个Person的切片。我们通过传递一个函数(匿名函数)给“sort.Slice”函数,来按照年龄对Person进行排序。这个匿名函数返回true或false,表示第一个参数是否小于第二个参数。这里的排序方式是按照Person的年龄从小到大排序。

二分查找

经过排序后,我们可以使用二分查找算法来查找切片中的元素。我们使用“sort.Search”函数进行二分查找。

index := sort.Search(len(people), func(i int) bool {
    return people[i].Age >= 25
})

if index < len(people) && people[index].Age == 25 {
    fmt.Printf("Found %s at index %d\n", people[index].Name, index)
} else {
    fmt.Println("Not found")
}

这个例子用来查找年龄为25的Person的位置。我们调用“sort.Search”函数,这个函数接收两个参数,第一个参数是需要查找的元素个数,这里是切片的长度,第二个参数是一个函数,这个函数用来比较中间元素和目标元素的大小关系。这个函数返回true或false,如果中间元素小于目标元素,则继续查找右半侧,否则查找左半侧。在这个例子中,如果中间元素的年龄小于25,则返回false,向右查找,否则返回true,向左查找。经过查找,如果找到目标元素,则返回该元素在切片中的位置,否则返回“未找到”。

示例代码和测试

完整的代码如下:

package main

import (
    "fmt"
    "sort"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    var people = []Person{
        {"Alice", 30},
        {"Bob", 20},
        {"Carl", 40},
        {"David", 25},
    }

    sort.Slice(people, func(i, j int) bool {
        return people[i].Age < people[j].Age
    })

    index := sort.Search(len(people), func(i int) bool {
        return people[i].Age >= 25
    })

    if index < len(people) && people[index].Age == 25 {
        fmt.Printf("Found %s at index %d\n", people[index].Name, index)
    } else {
        fmt.Println("Not found")
    }
}

我们运行这个程序,会得到输出:“Found David at index 1”。

结论

通过Golang的标准库中提供的“sort.Slice”和“sort.Search”函数,我们可以在一个自定义结构体切片上执行二分查找。在使用之前,我们需要为需要查找的字段进行排序。使用这两个函数可以节省开发时间和提高程序效率。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程