首页 > 编程语言 >二分查找算法的定义

二分查找算法的定义

时间:2024-06-03 20:28:32浏览次数:22  
标签:二分 int 元素 算法 查找 数组 目标值

      二分查找算法,也称为折半查找算法,是一种在有序数组中查找特定元素的常用算法,用于在有序数组或列表中查找特定元素的位置。它的基本思想是:首先确定目标值可能存在的区间,然后逐步缩小区间直到确定目标值的位置或者确定目标值不存在。

一、二分查找算法的原理:

  1. 前提条件:待查找的数组必须是有序的,通常是按照升序排列。
  2. 比较中间元素:在每一次迭代中,算法计算数组的中间索引,并将目标值与中间元素进行比较。
  3. 缩小查找范围:如果目标值小于中间元素,则目标值必定位于中间元素的左侧;如果目标值大于中间元素,则目标值必定位于中间元素的右侧。
  4. 重复查找:根据比较结果,将查找范围缩小为左侧或右侧的子数组,并重复上述步骤,直到找到目标值或查找范围为空为止。

  具体步骤如下:将数组按照元素值的大小进行排序,使得数组元素呈有序状态。

  1. 初始化两个指针low和high,分别指向数组的起始位置和结束位置。
  2. 在每一次循环中,计算中间位置mid=(low+high)/2,并取得中间位置的元素值。
  3. 如果中间位置的元素值与目标值相等,则找到了目标值,返回中间位置。
  4. 如果目标值小于中间元素,则更新右边界为中间索引减一:right = mid - 1
  5. 如果目标值大于中间元素,则更新左边界为中间索引加一:left = mid + 1
  6. 如果low大于high,说明目标值不存在于数组中,返回不存在的标识。

    二分查找算法的时间复杂度为O(logN),其中N为数组的长度。由于二分查找算法每次查找都将区间长度减半,因此其效率较高。

    需要注意的是,二分查找算法只适用于有序数组,如果数组是无序的,则需要先进行排序操作。另外,二分查找算法也只适用于静态查询,即查询操作比较频繁,而修改操作较少的情况下。如果需要频繁进行插入、删除等修改操作,建议采用其他数据结构。

二、二分查找算法的特点:

  • 时间复杂度:O(log n),其中 n 是数组的长度。
  • 空间复杂度:O(1),仅使用了常量级的额外空间。
  • 优点:查找效率高,尤其适用于大规模数据集。
  • 缺点:要求数组必须有序,并且不适用于动态变化的数据集。

三、二分查找的示例 

#include <iostream>
using namespace std;

int binarySearch(int arr[], int left, int right, int target) {
    while (left <= right) {
        int mid = left + (right - left) / 2;
        // 如果找到目标元素,返回索引
        if (arr[mid] == target) {
            return mid;
        }
        // 如果目标元素在左半边,继续在左半边进行二分查找
        if (arr[mid] > target) {
            right = mid - 1;
        }
        // 如果目标元素在右半边,继续在右半边进行二分查找
        else {
            left = mid + 1;
        }
    }
    // 如果没有找到目标元素,返回-1
    return -1;
}
int main() {
    int arr[] = {1, 3, 5, 7, 9, 11}; //初始化一个一维数组
    int n = sizeof(arr) / sizeof(arr[0]);
    int target = 7;
    int result = binarySearch(arr, 0, n - 1, target);//调用二分查找函数binarySearch()
    if (result == -1) {
        cout << "目标值 " << target << " 未找到";
    } else {
        cout << "目标值 " << target << " 在索引 " << result << " 处找到";
    }
    return 0;
} 

 

      感谢各位读者的阅读与支持,您的支持是我前进的动力!我希望我的博文能够带给您有益的信息和启发,让您的生活更加丰富多彩。如果您有任何问题或意见,请随时联系我或在评论区评论。再次感谢您的支持!希望以上示例对大家有帮助,如有疑问,欢迎您在评论区评论,谢谢!!!

标签:二分,int,元素,算法,查找,数组,目标值
From: https://blog.csdn.net/m0_75068978/article/details/139318710

相关文章

  • 编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(武器:排序算法)
    引言现在你已经拥有了c++的基础语法知识,人物已经有了基本属性,那么想要打怪,手里必须要有趁手的武器,各种算法就是手中的武器,要根据怪物的不同特性来选择不同的武器。本章节讲的就是新手第一把武器:排序算法。所谓排序算法就是把一些乱序的序列按照从小到大或从大到小进行排序,是......
  • Floyd判圈算法 leetcode
    龟兔赛跑/Floyd判圈算法概述判断一个链表是否存在环画图演示两个指针相遇的情况:查找链表中环的首个节点在这里插入图片描述数学公式表示为:(对应力扣142.环形链表II,141.环形链表I)判断一个链表是否存在环龟兔赛跑/Floyd判圈算法转换成判断链表是否存......
  • 2024年计算机视觉、设计与算法国际会议( ICCVDA 2024)
    2024年计算机视觉、设计与算法国际会议( ICCVDA2024)会议简介本次大会旨在建立一个国际性的学术交流和合作平台,重点关注计算机视觉领域的最新进展、设计与算法的创新应用,分享前沿研究成果,并探索未来发展趋势。我们诚挚邀请全球各地的学者、专家、企业代表及感兴趣的个人积......
  • 揭秘《庆余年算法番外篇》续集:范闲通过最大似然法推理找到火烧史家镇的凶手
    揭秘《庆余年算法番外篇》:范闲通过贝叶斯推理找到太子火烧使家镇的证据上次写了这篇文章之后,很多留言说开了上帝视角,先假设了二皇子和太子有罪,这次通过最大似然法进行推导。方法介绍:最大似然法是一种在概率统计中广泛使用的参数估计方法。该方法基于一组已知的样本数据,旨......
  • 机器学习_分类算法详解
    机器学习中的分类算法是用于将输入数据分配到预定义类别中的算法。分类任务是监督学习的一种,模型根据训练数据中的输入-输出对进行学习,然后预测新的输入数据的类别。常见的分类算法包括:逻辑回归(LogisticRegression)k-近邻(k-NearestNeighbors,k-NN)支持向量机(SupportVecto......
  • 机器学习_聚类算法详解
    聚类算法是无监督学习的一种,主要用于将数据集中的样本划分为若干个簇,使得同一簇内的样本具有较高的相似度,而不同簇之间的样本差异较大。以下是几种常见的聚类算法及其详细讲解:1.K-means聚类原理K-means是一种迭代优化算法,目标是将数据集分成K个簇,每个簇由一个中心点......
  • 文心一言 VS 讯飞星火 VS chatgpt (273)-- 算法导论20.2 8题
    八、假设设计了这样一个proto-vEB结构,其中每个簇数组仅有u14u^\frac{1}{......
  • 基于粒子群算法优化Kmeans聚类的居民用电行为分析研究(Matlb代码实现)
     ......
  • 【图像去噪】基于原始对偶算法优化的TV-L1模型进行图像去噪研究(Matlab代码实现)
    ......
  • 模式匹配---kmp算法
    模式匹配--Kmp算法暴力匹配暴力匹配,既普通模式匹配,主串一个一个地与子串进行比对,一旦匹配失败就跳回主串原指针的下一个重新回溯,子串跳回第一个,重新开始匹配。主串BABCBFDAB下标012345678子串BCB主串原指针指向下标为......