二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找算法的前提是传入的序列是有序的(降序或升序),并且有一个目标值。

二分查找的核心思想是将 n 个元素分成大致相等的两部分,取中间值 a[n/2] 与 x 做比较,如果 x=a[n/2],则找到 x,算法中止,如果 x<a[n/2],则只要在数组 a 的左半部分继续搜索 x,如果 x>a[n/2],则只要在数组 a 的右半部搜索 x。

二分查找虽然性能比较优秀,但应用场景也比较有限,底层必须依赖数组,并且还要求数据是有序的,对于较小规模的数据查找,我们直接使用顺序遍历就可以了,二分查找的优势并不明显,二分查找更适合处理静态数据,也就是没有频繁插入、删除操作的数据。

程序实现:

package main

import "fmt"

/*
二分查找函数,假设有序数组的顺序是从小到大
*/
func BinaryFind(arr *[]int, leftIndex int, rightIndex int, findValue int) { //判断leftIndex是否大于rightIndex
if leftIndex > rightIndex {
fmt.Println("未找到")
return
}
//先找到中间的下标
middle := (leftIndex + rightIndex) / if (*arr)[middle] > findValue {
fmt.Printf("小于中间 middle:%d, leftIndex: %d rightIndex:%d findValue:%d \n", middle, leftIndex, middle-, findValue)
//要查找的数,范围应该在leftIndex与 middle-1 之间
BinaryFind(arr, leftIndex, middle-, findValue) } else if (*arr)[middle] < findValue {
fmt.Printf("大于中间 middle:%d, leftIndex: %d rightIndex:%d findValue:%d \n", middle, middle+, rightIndex, findValue)
//要查找的数,范围应该在middle+1与 rightIndex 之间
BinaryFind(arr, middle+, rightIndex, findValue) } else {
fmt.Printf("找到了,下标为:%v \n", middle)
} } func main() {
//定义一个数组
arr := []int{, , , , , , , , , }
BinaryFind(&arr, , len(arr)-, )
fmt.Println("main arr=", arr)
}

执行结果:

大于中间  middle:, leftIndex:  rightIndex: findValue:
小于中间 middle:, leftIndex: rightIndex: findValue:
大于中间 middle:, leftIndex: rightIndex: findValue:
找到了,下标为:
main arr= [ ]

Go语言 二分查找算法的实现的更多相关文章

  1. C语言二分查找法

    参考了C语言中折半查找法(二分法)的实现 二分查找算法(C语言实现) 先附上代码 #include<stdio.h> int BinSearch(int arr[],int len,int ...

  2. python查找算法的实现-二分法

    1.算法:(设查找的数组期间为array[low, high]) (1)确定该期间的中间位置K(2)将查找的值T与array[k]比较.若相等,查找成功返回此位置:否则确定新的查找区域,继续二分查找. ...

  3. (经典) K&R的名著<<C程序设计语言>>二分查找

    #include<stdio.h> //查找成功则返回所在下标否则返回-1 int binsearch(int A[], int n,int a) { int low, high, mid ...

  4. C语言二分查找

    #include <stdio.h> /* 二分查找条件: 1.有序序列 2.数据在数组中 */ int baseBinarySearch(int a[],int h,int k) { ; ...

  5. Boyer-Moore字符串查找算法的实现

    前段时间在园子里看到一篇讲Boyer-Moore算法原理的文章http://kb.cnblogs.com/page/176945/,写的很详细,于是在这里自己写个C语言的实现,权当是练手吧. 基本思路 ...

  6. 查找算法的实现(C/C++实现)

    存档: #include <stdio.h> #include <stdlib.h> #define max 20 typedef int keytype; #include ...

  7. java 实现二分查找算法

    //二分查找算法的实现 public static int binarySearch(int[] arr,int search) { int low=0; int high=arr.length-1; ...

  8. 数据结构之二分查找——Java语言实现

    场景描述:给出一个数据序列长度为N,然后查找 一个数是否在数据序列中,若是,则返回在序列中的第几个位置. 首先可能第一个想到的就是按照顺序,从前到后一个一个进行查找,直到找到为止,若最后都没有,则说明 ...

  9. 一起talk C栗子吧(第二十五回:C语言实例--二分查找)

    各位看官们,大家好,上一回中咱们说的是顺序查找的样例,这一回咱们说的样例是:二分查找.闲话休 提,言归正转. 让我们一起talk C栗子吧. 看官们,我们在上一回中说了查找的相关内容,而且介绍了一种查 ...

随机推荐

  1. 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()

    前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...

  2. 【Unity|C#】基础篇(6)——const、readonly、static readonly

    [学习资料] <C#图解教程>(第6章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...

  3. 复选框与bitmap算法实践

    bitmap(位图)算法 bitmap算法是利用数据二进制的每一位的值来表示数据的算法,可用来压缩保存数据集. 如何保存 如 5(int)的二进制表示为 101b,第一位和第三位的值是1就可以表示数据 ...

  4. 3ds Max File Format (Part 5: How it all links together; ReferenceMaker, INode)

    At this point, you should start to familiarize yourself a bit with the publicly available 3ds Max AP ...

  5. 并查集路径减半优化 UnionFind PathHalving (C++)

    /* * UnionFind.h * 有两种实现方式,QuickFind和QuickUnion * QuickFind: * 查找O(1) * 合并O(n) * QuickUnion:(建议使用) * ...

  6. C语言结构体数组遇上typedef

    昨天韩同学在做数据结构题的时候,问了我一个关于typedef 与结构体数组的问题: typedef struct vexnode { int vertex; arcnode* firstarc; }a ...

  7. 矩阵快速幂 F[n]=F[n-2]*2+F[n-1]+i^4 hdu5950

    #include<cstdio> #include<algorithm> #include<math.h> #include<string.h> usi ...

  8. data-dismiss="modal"

    提交按钮不加: 加上则不会出现提示,直接关闭弹出框 <div class="modal fade" id="myModal" tabindex=" ...

  9. crontab实践

    1.crontab概要 2.crontab使用 3.关键配置信息 3.1如何配置定时任务 4.注意事项 参考 https://www.cnblogs.com/keithtt/p/6946498.htm ...

  10. ASCII编码,将英文存储到计算机

    前面我们已经讲到,计算机是以二进制的形式来存储数据的,它只认识 0 和 1 两个数字,我们在屏幕上看到的文字,在存储之前都被转换成了二进制(0和1序列),在显示时也要根据二进制找到对应的字符. 可想而 ...