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

思路

①先找到中间的下标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) / if (*arr)[middle] > findVal {
BinaryFind(arr, leftIndex, middle - , findVal)
} else if (*arr)[middle] < findVal {
BinaryFind(arr, middle + , rightIndex, findVal)
} else {
fmt.Printf("找到了,下标是%v\n", middle)
}
} func main() {
//定义一个数组
arr := []int{, , , , , , , , , , , , , , , , , }
BinaryFind(&arr, , len(arr) - , )
}
找到了,下标是6

Golang实现二分查找法的更多相关文章

  1. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  2. 用c语言编写二分查找法

    二分法的适用范围为有序数列,这方面很有局限性. #include<stdio.h> //二分查找法 void binary_search(int a[],int start,int mid ...

  3. java for循环和数组--冒泡排序、二分查找法

    //100以内与7相关的数   for(int a=1;a<=100;a++){    if(a%7==0||a%10==7||a/10==7){     System.out.print(a+ ...

  4. 二分查找法 java

    前几天去面试,让我写二分查找法,真是哔了狗! 提了离职申请,没事写写吧! 首先二分查找是在一堆有序的序列中找到指定的结果. public class Erfen { public static int ...

  5. 学习练习 java 二分查找法

    package com.hanqi; import java.util.*; public class Test5 { public static void main(String[] args) { ...

  6. Java-数据结构与算法-二分查找法

    1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...

  7. 选择、冒泡排序,二分查找法以及一些for循环的灵活运用

    import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] ar ...

  8. R语言实现二分查找法

    二分查找时间复杂度O(h)=O(log2n),具备非常高的效率,用R处理数据时有时候需要用到二分查找法以便快速定位 Rbisect <- function(lst, value){ low=1 ...

  9. java学习之—递归实现二分查找法

    /** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...

随机推荐

  1. gerrit设置非小组成员禁止下载代码

    对gerrit有所了解的同学,都知道gerrit 是我们常用的一个来做代码审核的工具,其中的权限管理,是一个非常重要的环节,关于每个权限的使用范围,可以参考博客https://blog.csdn.ne ...

  2. MongoDB--关于数据库及选择MongoDB的原因

    用户用数据库提供的接口将数据写入,数据会以标准的格式存储起来. 不同数据库的区别:存放数据的组织不同,同时提供不同种类的查询,用户按照自己的需求选择合适的数据库. 可以将地理位置存储在MongoDB中 ...

  3. cocos环境配置 -cocos2dx 入门

    cocos最好的是安装官方exe,官方会把cocos 3.10和cocos studio都安装好. Cocos2d-x v3.10:点击http://www.cocos.com/,进入cocos官网, ...

  4. 用xshell 连接docker Linux服务器

    用xshell 连接docker Linux服务器

  5. js中变量提升(一个是变量,一个是函数表达式都会存在变量提升,函数声明不存在)

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  6. 图像控件 ImageControl

    图像控件 书:164 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns: ...

  7. InstallShield2015制作安装包----------安装后实现电脑开机自启动

    开机自启动有两个方法: 一 .把程序的快捷方式放在”开始---启动“目录下. 二.把程序的安装目录放在注册表”“. 实现方法一: 1.编写bat脚本.执行bat启动exe. a)核心:cmd命令  : ...

  8. java详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  9. Unity之Vector3.SignedAngle实现

    如代码: float angle = Vector3.Angle(v1, v2); angle *= Mathf.Sign(Vector3.Cross(v1, v2).y);

  10. URL Resources

    Prezi 1. 官网   https://prezi.com/ 2. 入门教程   https://wenku.baidu.com/view/9bb234ac0029bd64783e2c6b.htm ...