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

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

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

目录
相关文章
|
1月前
|
存储 算法 索引
【优选算法】—— 二分查找
【优选算法】—— 二分查找
|
1月前
|
自然语言处理 算法 C++
在C++语言中非修正算法
在C++语言中非修正算法
13 1
C4.
|
1月前
|
存储 算法 C语言
关于c语言用计算机语言表示算法
关于c语言用计算机语言表示算法
C4.
17 1
|
1月前
|
算法 程序员 数据处理
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
|
2月前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
3月前
|
存储 JavaScript 算法
TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
42 0
|
3月前
|
存储 算法 Java
【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?
【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?
|
26天前
|
算法 索引
算法思想总结:二分查找算法
算法思想总结:二分查找算法
|
28天前
|
自然语言处理 算法 搜索推荐
用计算机语言表示算法
在计算机科学中,算法是解决问题的核心步骤和方法的描述。然而,算法本身并不直接执行;它们需要被转换成计算机可以理解和执行的指令,这通常是通过编写代码来实现的。不同的计算机语言提供了不同的方式来表示和实现算法。本文将讨论如何使用计算机语言来表示算法,并通过一个具体示例来展示这个过程。
14 0
|
1月前
|
算法 搜索推荐 大数据
在C++语言中排序、查找和算法的作用
在C++语言中排序、查找和算法的作用
10 0