适用于各语言的二分查找算法,你get到了嘛?

简介: 适用于各语言的二分查找算法,你get到了嘛?

目录

二分查找算法定义

二分查找算法的过程剖析

二分查找算法的时间复杂度

二分查找的平均查找长度

二分查找的普通算法

二分查找的函数递归算法

Hello!大家好,我是努力赚钱买生发水的灰小猿,最近在做开发的时候偶然用到了之前数据结构上的二分查找算法,所以在这里和大家简单的分享一下适用于各种语言的二分查找算法编写。

那么什么叫二分查找算法呢?

二分查找算法定义

所谓二分查找算法,又叫折半查找,一般来说适用于数组元素,具体来说应该是已经按照顺序存储结构排列好的数组元素。它是一种效率较高的查找算法,通过对顺序表进行折半查找,从而获取到元素序列或查找次数的算法。

二分查找算法的过程剖析

我们假设现有的线性表中的元素是按照升序排列的,二分查找算法的思路就是将正在查找的表的中间元素和要查找的元素进行大小比较,若大小相等则输出该元素所在位置或查找次数;

若该中间元素不等于被查找元素时,会将该线性表以中间元素分成前后两部分的线性表,当中间元素小于被查找元素时,重新对后一部分的线性表进行二分查询;

反之,若中间元素大于被查找元素时,对前一部分的线性表进行相同的二分查找,当中间元素等于被查找元素时,查找结束;或直到线性表无法再进行分割时,查找结束,这个时候则说明表中无该元素。

下面是二分查找算法的查找图示:

二分查找算法的时间复杂度

二分查找的基本思想是:设有一个长度为n个元素的升序排列的数组a,分成前后大致相等的两部分,取中间元素a[n/2]与被查找元素(m)做比较,如果m=a[n/2],则找到m,算法中止;

如果m<a[n/2],则只要在数组a的左半部分继续二分查找m,如果m>a[n/2],则在数组a的右半部继续二分查找m.直到m=a[n/2]或数组不可再分割时查找结束。

因此时间复杂度就是while循环的次数,

总共有n个元素,

依次循环下去以后每次查找的元素个数就是:n、n/2、n/4、....n/2^k

若查找个数为n时,也就是第一次查找就找到了元素,则循环次数为1(也就是k=0的时候)所以循环次数为(k+1)

由于n/2^k取整后为(n/2^k)>=1

即令(n/2^k)=1

可得k=log2n,(是以2为底,n的对数)

所以时间复杂度可以表示O(h)=O(log2n)。

二分查找的平均查找长度

设待查找的元素为n,则折半查找的平均查找长度为:

二分查找的普通算法

以下为进行二分查找的函数方法,

传入的参数为升序排列的数组和要查找的元素,若查找到该元素,则返回查找次数,否则返回-1。

int binary_search(int[] a, int value)
{

    int low = 0;

    int high = a.length - 1;

    while (low <= high)

    {

        int middle = (low + high) / 2;

        if (a[middle] == value)

        {

            return middle;

        }

        if (value < a[middle])

        {

            high = middle - 1;

        }

        else

        {

            low = middle + 1;

        }

    }

    return -1;

}

二分查找的函数递归算法

传入的参数分别为:递增的数组、要查找的数值、起始查找位置(默认为0)、终止查找位置(默认为数组长度)

int binary_search_ecursion(int a[],int value,int low,int high) {

int middle=0;
if(low<=high)
{        
    middle = (low+high)/2;
    if (a[middle]==value) {
        return middle;
    }else {
        if (a[middle]<value) {
            return binary_search_ecursion(a, value, middle+1, high);
        }
        else {
            return binary_search_ecursion(a, value, low, middle-1);
        }
    }
}
return -1;

}

二分查找的思维方法适用于任何需要进行顺序表查找的语言,并且基本思路都是一样的。上面的二分查找函数是基于C#的,小伙伴们还可以进行延伸。

觉得有用记得点赞关注哟!

大灰狼期待与你一同进步!

目录
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
80 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
4月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
2月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
2月前
|
消息中间件 存储 算法
一文搞懂二分查找算法!
一文搞懂二分查找算法!
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
23 0
|
2月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
41 0
|
4月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
4月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
110 0
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
5月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
62 3