使用 Go 语言对自定义结构体切片进行二分查找的程序
在这篇 Go 语言文章中,我们将使用迭代和递归方法对自定义结构体切片进行二分查找。二分查找是一种搜索算法,用于在已排序的元素序列中查找特定值的所在位置。
算法
步骤 1 − 首先,我们需要导入 fmt 包。
步骤 2 − 创建一个自定义的 Person 结构体,其中包含字符串类型的 name 和整型类型的 age。
步骤 3 − 现在,创建一个 bSearch() 函数,用于对 Person 结构体切片进行二分查找。
步骤 4 − 它将 low 和 high 变量分别初始化为切片的开头和结尾,然后循环持续执行,直到 low 小于或等于 high。
步骤 5 − 在每次循环迭代中,它计算 low 和 high 之间的中间点,并将该索引处的 Person 的 name 字段与 key 进行比较。
步骤 6 − 如果 name 字段等于 key,则函数返回索引。如果 name 字段小于 key,则将 low 更新为 mid + 1。否则,将 high 更新为 mid - 1。
步骤 7 − 启动 main() 函数。在 main() 函数内部,创建一个 Person 结构体切片和一个要搜索的 key。
步骤 8 − 现在,调用 bSearch() 函数并将结构体和 key 作为参数传递给它。
步骤 9 − 将结果消息打印到控制台。如果函数返回 -1,则返回 false,否则返回 true。
示例 1
在本例中,我们将定义一个 bSearch() 函数,用于使用迭代方法对自定义结构体切片进行二分查找。
package main import "fmt" type Person struct { name string age int } func bSearch(people []Person, key string) int { l := 0 h := len(people) - 1 for l <= h { mid := (l + h) / 2 if people[mid].name == key { return mid } else if people[mid].name < key { l = mid + 1 } else { h = mid - 1 } } return -1 } func main() { people := []Person{ {"Amy", 15}, {"Bix", 20}, {"Jim", 25}, {"Ross", 40}, {"Siri", 45}, } key := "Siri" i := bSearch(people, key) if i == -1 { fmt.Printf("%s not found\n", key) } else { fmt.Printf("%s found at index %d\n", key, i) } }
输出
Siri found at index 4
示例 2
在本例中,我们将定义一个 bSearch() 函数,用于使用递归方法对自定义结构体切片进行二分查找。
package main import "fmt" type Person struct { Name string Age int } func bSearch(people []Person, target Person, low int, high int) int { if low > high { return -1 } mid := (low + high) / 2 if people[mid] == target { return mid } else if people[mid].Age < target.Age { return bSearch(people, target, mid+1, high) } else { return bSearch(people, target, low, mid-1) } } func main() { people := []Person{ {"Angel", 10}, {"Carie", 12}, {"Simona", 15}, {"John", 17}, {"Sam", 20}, } target := Person{"John", 17} index := bSearch(people, target, 0, len(people)-1) if index != -1 { fmt.Printf("%s found at index %d\n", target.Name, index) } else { fmt.Printf("%s not found\n", target.Name) } }
输出
John found at index 3
结论
我们已经成功编译并执行了一个 Go 语言程序,该程序使用迭代和递归方法对自定义结构体切片进行二分查找,并附带两个示例。在第一个示例中,我们使用了迭代方法,在第二个示例中,我们使用了递归方法。