前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 实现二分查找算法

Go 实现二分查找算法

作者头像
王小明_HIT
发布2023-03-01 15:59:11
1700
发布2023-03-01 15:59:11
举报
文章被收录于专栏:程序员奇点程序员奇点

Go 实现二分查找算法

二分查找算法简介:二分查找算法对有序数组有效,二分搜索是查找数组中的目标值。

在一个有序数组中,将数组分成两段,将要查询的铁元素和分割点比较:

  1. 如果相等,直接返回,说明数据找到
  2. 目标元素大于分割点,在分割点右边继续查找
  3. 元素小于分割点,在分割点左侧继续查找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6GXGMKI-1654416113888)(https://zh.wikipedia.org/wiki/File:Binary_search_into_array.png)]

二分查找算法模板:

代码语言:javascript
复制
int binarySearch(int[] nums, int target) {
    int left = 0, right = ...;

    while(...) {
        int mid = (right + left) / 2;
        if (nums[mid] == target) {
            ...
        } else if (nums[mid] < target) {
            left = ...
        } else if (nums[mid] > target) {
            right = ...
        }
    }
    return ...;
}

再有个标准写法

代码语言:javascript
复制
int BinarySearch(int array[], int n, int value)
{
    int left = 0;
    int right = n - 1;
    //如果这里是int right = n 的话,那么下面有两处地方需要修改,以保证一一对应:
    //1、下面循环的条件则是while(left < right)
    //2、循环内当 array[middle] > value 的时候,right = mid

    while (left <= right)  //循环条件,适时而变
    {
        int middle = left + ((right - left) >> 1);  //防止溢出,移位也更高效。同时,每次循环都需要更新。

        if (array[middle] > value)
        {
            right = middle - 1;  //right赋值,适时而变
        }
        else if(array[middle] < value)
        {
            left = middle + 1;
        }
        else
            return middle;
        //可能会有读者认为刚开始时就要判断相等,但毕竟数组中不相等的情况更多
        //如果每次循环都判断一下是否相等,将耗费时间
    }
    return -1;
}

Go-二分查找算法

给定一个有序数组,查找第一个等于 target 的下标,找不到返回 -1.

代码中有一个要注意的是溢出问题: mid := low + ((high - low) >> 1) // 溢出

代码实现如下:

代码语言:javascript
复制
package algorithm

import (
 "fmt"
 "testing"
)

func binarySearch(arr []int, target int) int {
 low := 0
 high := len(arr) - 1
 for low <= high {
  //mid := (low + high) / 2
  mid := low + ((high - low) >> 1)
  //fmt.Println(mid)
  if arr[mid] > target {
   high = mid - 1
  } else if arr[mid] < target {
   low = mid + 1
  } else {
   return mid
  }
 }
 return -1
}

func TestBinarySearch(t *testing.T) {
 /*arr := make([]int, 1024*1024, 1024*1024)
 for i := 0; i < 1024*1024; i++ {
  arr[i] = i + 1
 }*/

 //arr := []int{1, 9, 10, 30, 2, 5, 45, 8, 63, 234, 12}
 //QuickSort(arr, 0, len(arr)-1)
 //fmt.Println(arr)
 arr := []int{1, 2, 5, 8, 9, 10, 12, 30, 45, 63, 234}

 id := binarySearch(arr, 9)
 if id != -1 {
  fmt.Println(id, arr[id])
 } else {
  fmt.Println("没有找到数据")
 }
}

执行结果如下:

代码语言:javascript
复制
=== RUN   TestBinarySearch
3 8
--- PASS: TestBinarySearch (0.00s)
PASS
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go 实现二分查找算法
    • 二分查找算法模板:
      • Go-二分查找算法
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档