zoukankan      html  css  js  c++  java
  • Golang实现二分查找法

    二分查找法就是实现在一组有序的数字数组集合中最快找到指定元素的下标

    思路

    ①先找到中间的下标middle = (leftIndex + RightIndex) /2 ,然后让中间的下标值和FindVal比较
    a:如果arr[middle] > FindVal,那么就向LeftIndex~(midlle - 1)区间找
    b:如果arr[middle] < FindVal,那么就向middle + 1 ~RightIndex区间找
    c:如果arr[middle] == FindVal,那么直接返回
    ②从①的a、b、c递归执行,知道找到位置
    ③如果LeftIndex > RightIndex,则表示找不到,退出

    代码/举例
    假设说我要查找30这个值,如果按照循环的查找方法,找到30这个值要执行7次。那么如果是按照二分查找呢?好吧,二分查找的过程如下:

    1. left = 1, right = 18; mid = (1+18)/2 = 9; 51 > 30

    2. left = 1, right = mid - 1 = 8; mid = (1+8)/2 = 4; 15 < 30

    3. left = mid + 1 = 5, right = 8; mid = (5+8)/2 = 6; 30 = 30 查找完毕

    只需要执行3次,大大减少了执行时间

    //代码
    package main
    import (
        "fmt"
    )
    
    //二分查找函数 //假设有序数组的顺序是从小到大(很关键,决定左右方向)
    func BinaryFind(arr *[]int, leftIndex int , rightIndex int, findVal int) {
        //判断leftIndex是否大于rightIndex
        if leftIndex > rightIndex {
            fmt.Println("没找到")
            return 
        }
        
        //先找到中间的下标
        middle := (leftIndex + rightIndex) / 2 
    
        if (*arr)[middle] > findVal {  
            BinaryFind(arr, leftIndex, middle - 1, findVal)
        } else if (*arr)[middle] < findVal {
            BinaryFind(arr, middle + 1, rightIndex, findVal)
        } else {
            fmt.Printf("找到了,下标是%v
    ", middle)
        }
    }
    
    
    func main() {
        //定义一个数组
        arr := []int{1, 2, 5, 7, 15, 25, 30, 36, 39, 51, 67, 78, 80, 82, 85, 91, 92, 97}
        BinaryFind(&arr, 0, len(arr) - 1, 30)
    }
    找到了,下标是6
  • 相关阅读:
    ArrayList与LinkedList区别
    ArrayList底层原理
    nginx启用https访问
    云服务器搭建 Nginx 静态网站
    在云服务器上(CentOS)上安装Node
    文本超出显示省略号CSS
    vue使用改变element-ui主题色
    vue中的select框的值动态绑定
    vue项目对axios的全局配置
    使用crypto-js对数据进行AES加密、解密
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9638350.html
Copyright © 2011-2022 走看看