Go语言实现二分查找算法


在编程中,要从数组、链表或任何其他数据结构中搜索任何内容,我们有一些搜索算法,其中之一就是二分查找。在二分查找中,前提是数据必须已排序。在二分查找中,我们遵循分治法,其中我们通过应用某些条件来划分数据,然后仅对该数据执行操作。这样,我们就可以降低时间复杂度。

例如,如果我们有一个元素数组 {20, 44, 45, 54, 67, 88, 91},并且我们想找到 44,那么二分查找算法将以以下方式找到该元素。

  • 找到中间元素 54 并将其与要搜索的元素(即 44)进行比较,因为 54 大于 44,所以我们不会在右侧搜索,而是划分数组并向右移动。

  • 现在数组为 {20, 44, 45},我们再次与中间元素进行比较,这次中间元素与我们正在搜索的元素匹配。

算法

步骤 1:使用 import 关键字在顶部导入所需的包。

步骤 2:然后 main 函数将首先运行。

  • 首先,我们声明并初始化数组。

  • 调用 binarySearch() 函数通过传递数组、大小和要搜索的元素作为参数来搜索元素。

  • 最后,打印结果,说明元素是否存在。

步骤 3.1:在 binarySearch() 函数中

  • 在第一种方法中,我们正在数组上运行一个 for 循环,其中我们有两个迭代器 left 和 right。

  • 在循环内部,我们找到 left 和 right 的中间值,并将元素与索引 m 处的值进行比较。如果值匹配,则返回索引。

  • 如果索引 m 处的值大于我们正在搜索的值,则我们将 m-1 分配给迭代器 right。

  • 如果索引 m 处的值小于我们正在搜索的值,则我们将 m 分配给迭代器 left。

  • 最后,如果元素不存在,则返回 -1。

步骤 3.2:在 binarySearch() 函数中

  • 在第二种方法中,该函数是递归的。

  • 基本条件是,如果 left 迭代器大于或等于 right 迭代器,则返回 -1。

  • 在递归函数内部,我们找到 left 和 right 的中间值,并将元素与索引 m 处的值进行比较。如果值匹配,则返回索引。

  • 如果索引 m 处的值大于我们正在搜索的值,则我们通过将 m-1 传递给迭代器 right 来调用 binarySearch() 函数。

  • 如果索引 m 处的值小于我们正在搜索的值,则我们通过将 m 传递给迭代器 left 来调用 binarySearch() 函数。

示例 1

在此示例中,我们将使用简单的 for 循环实现二分查找。在循环中,我们将找到索引 right 和 left 之间的中间元素。如果索引 m 处的元素与我们正在搜索的元素匹配,则我们将返回 m 并停止迭代,否则我们将相应地更新 right 和 left 并继续迭代。

package main

import "fmt"

// function to print the array with array and
// size of the array as argument
func printArray(array []int, size int) {
    for i := 0; i < size; i++ {
        fmt.Print(array[i], " ")
    }
    fmt.Println()
}

// binary search function to find an element in the array
func binarySearch(array []int, size int, toFind int) int {
    var left, right, m int
    left = 0
    right = size

    for left < right {
        m = (right + left) / 2
        if array[m] == toFind {
            // if the element at index m is equal to the element we
            // are searching then returning m
            return m
        } else if array[m] > toFind {
            //If the element at index m is greater than the element
            //We are searching then we are skipping the right side
            // of the array
            right = m - 1
        } else {
            //If the element at index m is less than the element
            //We are searching then we are skipping the left side
            // of the array
            left = m
        }
    }

    return -1
}

func main() {
    // decalring and initializing the
    // array using the shorthand method
    array := []int{20, 44, 45, 54, 67, 88, 91}

    // decalring and initializing the
    // variable using the var keyword
    var toSearch int
    toSearch = 3

    fmt.Println("Golang program to find an element in an array using binary search using for loop.")
    fmt.Print("array: ")
    printArray(array, 6)
    // linear search function passing array and
    // variable as a parameter
    index := binarySearch(array, 6, toSearch)

    if index == -1 {
        fmt.Println(toSearch, "is not present in the array.")
    } else {
        fmt.Println(toSearch, "is present at index", index, "in the array.")
    }

}

输出

Golang program to find an element in an array using binary search recursively.
array: 20 44 45 54 67 88 
3 is not present in the array.

示例 2

在此示例中,我们将使用递归函数实现二分查找。在递归调用中,我们将找到索引 right 和 left 之间的中间元素。如果索引 m 处的元素与我们正在搜索的元素匹配,则我们将返回 m 并停止递归调用,否则我们将相应地更新 right 和 left 并继续调用函数,直到基本条件匹配。

package main

import "fmt"

   // function to print the array with array and
   // size of the array as argument
   func printArray(array []int, size int) {
      for i := 0; i < size; i++ {
         fmt.Print(array[i], " ")
      }
      fmt.Println()
   }

   // binary search function to find an element in the array
   func binarySearch(array []int, left int, right int, toFind int) int {
      if left >= right {
         // returning -1 if value not present in the array
         return -1
      }
      //Finding a middle index of the current array
      m := (right + left) / 2

     if array[m] == toFind {
        // if the element at index m is equal to the element we
        // are searching then returning m
        return m
     } else if array[m] > toFind {
        //If the element at index m is greater than the element
        //We are searching then we are skipping the right side
        // of the array
        return binarySearch(array, left, m, toFind)
     } else {
        //If the element at index m is less than the element
        //We are searching then we are skipping the left side
        // of the array
        return binarySearch(array, m+1, right, toFind)
    }
}

func main() {
    // decalring and initializing the
    // array using the short hand method
    array := []int{20, 44, 45, 54, 67, 88, 91}

    // decalring and initializing the
    // variable using the var keyword
    var toSearch int
    toSearch = 44

    fmt.Println("Golang program to find an element in an array using binary search recursively.")
    fmt.Print("array: ")
    printArray(array, 6)
    // linear search function passing array and
    // variable as a parameter
    index := binarySearch(array, 0, 6, toSearch)

    if index == -1 {
        fmt.Println(toSearch, "is not present in the array.")
    } else {
        fmt.Println(toSearch, "is present at index", index, "in the array.")
    }

}

输出

Golang program to find an element in an array using binary search using for loop.
array: 20 44 45 54 67 88 
44 is present at index 1 in the array.

结论

这是在 Go 语言中执行二分查找的两种方法。第二种方法有多个函数调用,对于具有大量元素的数组,堆栈将过载。对于简单的操作执行此操作不是一种合适的编程方式,因此运行 for 循环的第一种方法将是实现此目标的更有效方法。要了解有关 Go 语言的更多信息,您可以浏览这些教程

更新于: 2023-07-10

410 次查看

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告