二分查找算法

简介: 以整型升序数组arr为例,将数组分为两部分:数组大小为size,设置数组下标left、mid、right,初始时分别为首元素下标0、中间元素下表(right-left)/2和最后元素下标 size-1,左部分为left-mid,右部分为 mid-right设查找值为x,比较x与mid的大小。

二分查找相比于遍历查找


优点:比较次数少、查找速度快


缺点:只针对于有序数组


思想:


以整型升序数组arr为例,将数组分为两部分:数组大小为size,设置数组下标left、mid、right,初始时分别为首元素下标0、中间元素下表(right-left)/2和最后元素下标 size-1,左部分为left-mid,右部分为 mid-right


设查找值为x,比较x与mid的大小:


1.若x<arr[mid],则说明查找值x在左部分,只需要在这一部分查找,将左部分作为新的整体区间,right更新为mid-1,mid重新计算,mid=(right+left)/ 2;


2.同理,若x>arr[mid],则说明查找值x在右部分,只需要在这一部分查找,将右部分作为新的整体区间,left更新为mid+1,mid重新计算,mid=(right+left)/ 2;


3.若x=mid,则查找成功,返回查找值x的下标mid


如此循环,循环条件为 left<=right , 若直到 left>right 仍为查找成功,则说明数组内查找值x不存在,返回-1

int search(int* arr, int size, int x)
{
    int left = 0;
    int right = size - 1;
    int mid = (left + right) / 2;
    while (left <= right)
    {
        if (x == arr[mid])
        {
            return mid;
        }
        else if (x < arr[mid])
        {
            right = mid - 1;
            mid = (left + right) / 2;
        }
        else if (x > arr[mid])
        {
            left = mid + 1;
            mid = (left + right) / 2;
        }
    }
    return -1;
}

算法优化:优化求mid的方法,原先的算法mid=(left+right)/ 2 ,若left和right是两个2特别大的整数,相加后可能会溢出,因此需要改进


mid = (right - left)/ 2 + left  


用大数减去小数得到多余部分,除以2再加上小数就得到两个数的平均数


优化后代码:

int search(int* arr, int size, int x)
{
    int left = 0;
    int right = size - 1;
    int mid = (left + right) / 2;
    while (left <= right)
    {
        if (x == arr[mid])
        {
            return mid;
        }
        else if (x < arr[mid])
        {
            right = mid - 1;
            mid = (right - left) / 2 + left;
        }
        else if (x > arr[mid])
        {
            left = mid + 1;
            mid = (right - left) / 2 + left;
        }
    }
    return -1;
}


目录
相关文章
|
2月前
|
算法 程序员 数据处理
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解
|
2月前
|
存储 算法 索引
【优选算法】—— 二分查找
【优选算法】—— 二分查找
|
2月前
|
算法 测试技术 索引
算法-二分查找
算法-二分查找
21 0
|
5天前
|
算法 Java 机器人
Java数据结构与算法:查找算法之二分查找
Java数据结构与算法:查找算法之二分查找
|
7天前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
11天前
|
机器学习/深度学习 算法 索引
数据结构算法--1 顺序查找二分查找
**顺序查找时间复杂度为O(n)**,适合无序列表,可以通过`enumerate`或直接遍历索引来实现。**二分查找时间复杂度为O(logn)**,适用于有序列表,利用Python中`left`、`right`指针和`mid`点不断缩小搜索范围。效率上二分查找更优。
|
11天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
15 1
|
13天前
|
算法 搜索推荐 Java
二分查找算法详解及实现
二分查找算法详解及实现
18 2
|
25天前
|
算法 Java
JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)
JavaSE——算法(2/2):查找算法-二分查找(前言、详细图解、代码部分)
34 2
|
26天前
|
算法
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
数据结构和算法学习记录——时间复杂度的计算(嵌套循环、大O的渐进表示法、双重循环、常数循环、strchr、冒泡排序、二分查找、斐波那契数列递归)
35 1