适用于各语言的二分查找算法,你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#的,小伙伴们还可以进行延伸。

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

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

目录
相关文章
|
6天前
|
算法
【算法】二分查找——二分查找
【算法】二分查找——二分查找
|
6天前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
算法 搜索推荐 C语言
用计算机语言表示算法
用计算机语言表示算法
32 1
|
4天前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
6天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
22天前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
34 3
|
1月前
|
算法
【算法】二分查找(整数二分和浮点数二分)
算法学习——二分查找(整数二分和浮点数二分)
25 0
【算法】二分查找(整数二分和浮点数二分)
|
2月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
2月前
|
机器学习/深度学习 算法 索引
数据结构算法--1 顺序查找二分查找
**顺序查找时间复杂度为O(n)**,适合无序列表,可以通过`enumerate`或直接遍历索引来实现。**二分查找时间复杂度为O(logn)**,适用于有序列表,利用Python中`left`、`right`指针和`mid`点不断缩小搜索范围。效率上二分查找更优。
|
2月前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
28 1

热门文章

最新文章