使用 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 语言程序,该程序使用迭代和递归方法对自定义结构体切片进行二分查找,并附带两个示例。在第一个示例中,我们使用了迭代方法,在第二个示例中,我们使用了递归方法。

更新于: 2023年4月3日

789 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告