Golang 程序实现二分查找


2022 年 4 月 23 日, Learn eTutorial
1704

为了更好地理解这个示例,我们始终建议您学习下面列出的 Golang 编程 的基础主题

这里我们将解释如何编写一个 GO 程序来从任何数据结构中搜索元素。有不同类型的搜索算法。在本例中,我们使用二分查找来从数组中查找或搜索元素。

二分查找是一种快速搜索算法,最重要的是二分查找技术仅在元素按排序顺序排列时才有效。它遵循分而治之的原则。这意味着它通过将搜索空间分成两半并在该部分中查找元素来在排序数组中搜索元素。重复此过程,直到找到值或区间为空。

在这种技术中,第一次搜索从覆盖整个数组的区间开始,它通过比较集合的中间项来查找特定项。如果匹配发生,则返回该特定项,否则搜索继续。假设搜索键的值大于中间元素,则搜索键只能位于中间元素之后的右半子数组中。因此,我们对中间元素的右半部分进行递归。否则,搜索键小于中间元素。因此,我们对中间元素的左半部分进行递归。继续此过程,直到找到值或子数组的大小减小到零。

如何实现二分查找

在这个 GO 程序中,我们导入了“fmt”包,以在程序中包含一些标准库。之后,主函数开始,在主函数内部,我们正在执行整个程序。请注意,二分查找算法的时间复杂度为 Ο(log n)。

在这个 GO 程序中,我们使用 fmt.scanln() fmt.println() 方法接受用户输入的值,这些方法在 fmt 包下定义。为了使用这些函数,我们需要导入“fmt”

这里变量 A 存储数组元素。其他变量 n, x 分别用作数组大小和搜索元素。使用 for 循环读取数组元素。请注意,二分查找仅在元素按排序顺序排列时才有效。因此,对数组元素进行冒泡排序,并使用for 循环和“fmt.Println”显示排序后的数组。

变量 Low 和 High 用作函数参数。分配 Low=0, High=n-1 并通过调用函数 binarySearch(A, Low, High, num) 执行二分查找。在此函数中,将搜索元素 x 与中间元素 m 进行比较。如果 low<=high,我们使用公式计算中间元素 m。如果搜索元素 x 与中间元素匹配,我们返回中间元素的索引。否则,检查 x 是否大于中间元素,那么 x 只能位于中间元素之后的右半子数组中。因此,我们对右半部分进行递归。因此分配 low = m + 1 并调用函数 binarySearch(A, low, high, x)。否则,x 只能位于中间元素之前的左半子数组中。如果是这样,分配 high = m -1 并调用函数 binarySearch(A, low, high, x)

下面是在 Go 程序中实现二分查找所使用的步骤。
 

算法

第一步:导入 fmt

步骤 2:打开 main() 开始程序,GO 程序执行从 main() 开始

步骤 3:声明变量 n, x, temp, Low, High 和 result

步骤 4:读取数组大小为 n

步骤 5:定义数组 A[]。

步骤 6: 使用 for 循环读取 A[] 数组元素。

步骤 7: 打开嵌套的“for 循环”以实现冒泡排序算法。

步骤 8: 使用 if 条件检查,比较元素是否大于被比较元素

步骤 9: 如果是,使用临时变量交换元素。

步骤 10: 使用“for 循环”和 fmt.Println 打印排序后的数组。

步骤 11: 读取要搜索的数字 x。

步骤 12: 将 Low 赋值为 0 ,High 赋值为项数 n-1。

步骤 13: 调用函数 binarySearch (A, Low, Highx) 并将返回值赋给 result。

步骤 14:使用“if 条件”检查结果是否等于 -1。如果是,则打印“Element not found”

步骤 15: 否则打印找到的元素的位置。即;result+1

步骤 16: 退出

实现 binarySearch (A, Low, Highx) 函数的步骤

步骤 1: 声明变量 m 为中间元素。

步骤 2: 如果 low=high,使用公式 (low + high) / 2 计算中间元素 m。否则,返回 -1 并退出函数。

步骤 3: 使用“if”条件检查搜索键 x 是否等于数组中间元素 m。如果是,则返回 m 的值并退出此函数。

步骤 4: 使用“if”条件检查搜索键 x 是否小于数组中间元素 m。如果是,则 high = mid -1 并调用函数 binarySearch (A, Low, Highx)。

步骤 5: 否则检查搜索键 x 是否小于数组中间元素,如果是,则 low = mid + 1 并调用函数 binarySearch (Alowhighx)。

 

Golang 源代码

                                          package main
import  "fmt"
func binarySearch(A[]int, low int, high int, x int) int {
 if low <= high {
  var m int
  m = (high + low) / 2

  if A[m] == x {
   return m
  }

  if A[m] > x {
   return binarySearch(A, low, m-1, x)
  } else {
   return binarySearch(A, m+1, high, x)
  }
 }

 return -1
}

func main() {
 fmt.Println("Enter the size of the array")
 var n int
 fmt.Scan(&n)
 var x int
 A := make([]int, n, 100)
        fmt.Println("Enter elements:")
 for i := 0; i < n; i++ {
  fmt.Scan(&A[i])
 }
 var temp int
        for i := 0; i < n; i++ {
 for j := 0; j <(n-i-1); j++ {
   if A[j] > A[j + 1]{
           temp = A[j];
           A[j] = A[j + 1];
           A[j + 1] = temp;
         }
      }
         }
        fmt.Println("Sorted array:")
 for i := 0; i < n; i++ {
  fmt. Println (A[i])
 }
        fmt.Println("Enter the number to be searched:")
 fmt.Scan(&x)
 var result int
 result = binarySearch(A, 0, n-1, x)
 if result == -1 {
  fmt.Println("Search element not found !")
 } else {
  fmt.Println("Search element found at position: ", result+1)
 }
}

                                      

输出

Enter the size of the array
5
Enter elements: 
52
32
45
10
90
Sorted array: 
10
32
45
52
90
Enter the number to be searched:
45
Search element found at position:  3