数据结构——二分查找法

二分查找法(Binary Search)是一种高效的查找算法,通常用于在已排序的数组或列表中查找特定的目标值。这个算法的基本思想是不断将查找范围缩小为原来的一半,直到找到目标值或确定目标值不存在。

二分查找是一种在每次比较之后将查找空间一分为二的算法。每次需要查找集合中的索引或元素时,都应该考虑二分查找。如果集合是无序的,我们可以总是在应用二分查找之前先对其进行排序。

二分查找一般由三个主要部分组成:

1.预处理一如果集合未排序,则进行排序.

2.二分查找一 使用循环或递归在每次比较后将查找空间划分为两半

  1. 后处理在剩余空间中确定可行的候选者

1.二分查找函数 是二分查找的最基础和最基本的形式。这是一个标准的二分查找模板

cpp 复制代码
int binarySearch(const std::vector<int>& arr, int target) {
    int left = 0;
    int right = arr.size() - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid; // 找到目标值,返回其索引
        }
        else if (arr[mid] < target) {
            left = mid + 1; // 目标值在右半部分
        }
        else {
            right = mid - 1; // 目标值在左半部分
        }
    }

    return -1; // 目标值不存在
}

2.二分查找函数 是二分查找的高级模板。它用于查找需要访问数组中当前索引及其直接右邻居索引的元素或条件。

cpp 复制代码
int binarySearch(vector<int>& nums, int target) {
    if (nums.size() == 0)
        return -1;

    int left = 0, right = nums.size();

    while (left < right) {
        // Prevent (left + right) overflow
        int mid = left + (right - left) / 2;
        if (nums[mid] == target)
        { 
            return mid;
        }
        else if (nums[mid] < target) 
        { 
            left = mid + 1; 
        }
        else 
        { 
            right = mid; 
        }
    }

    // Post-processing:
    // End Condition: left == right
    if (left != nums.size() && nums[left] == target) 
        return left;

    return -1;
}

3.二分查找函数 是二分查找的另一种独特形式。 它用于搜索需要访问当前索引及其在数组中的直接左右邻居索引的元素或条件。

cpp 复制代码
int binarySearch3(vector<int>& nums, int target) {
    if (nums.size() == 0)
        return -1;

    int left = 0, right = nums.size() - 1;
    while (left + 1 < right) {
        // Prevent (left + right) overflow
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) 
        {
            return mid;
        }
        else if (nums[mid] < target)
        {
            left = mid;
        }
        else
        {
            right = mid;
        }
    }

    // Post-processing:
    // End Condition: left + 1 == right
    if (nums[left] == target)
        return left;

    if (nums[right] == target)
        return right;

    return -1;
}
相关推荐
zs宝来了几秒前
HOT100-二分查找类型题
算法
_w_z_j_2 分钟前
数组中的最长连续子序列
数据结构·算法
地平线开发者4 分钟前
征程 6E/M 计算平台部署指南
算法·自动驾驶
mit6.82430 分钟前
数位dp|组合数学|差分emplace
算法
2301_7644413334 分钟前
新能源汽车电磁辐射高级预测
python·算法·数学建模·汽车
Keep_Trying_Go40 分钟前
论文Leveraging Unlabeled Data for Crowd Counting by Learning to Rank算法详解
人工智能·pytorch·深度学习·算法·人群计数
fpcc43 分钟前
跟我学C++中级篇——重载问题分析之函数模板重载的问题
c++
仟濹1 小时前
【C/C++】经典高精度算法 5道题 加减乘除「复习」
c语言·c++·算法
顾安r1 小时前
11.21 脚本 网页优化
linux·前端·javascript·算法·html
kk”2 小时前
C++ map
开发语言·c++