数据结构——二分查找法

二分查找法(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;
}
相关推荐
weixin_435208162 分钟前
通过 Markdown 改进 RAG 文档处理
人工智能·python·算法·自然语言处理·面试·nlp·aigc
我不想当小卡拉米3 分钟前
C++:继承+菱形虚拟继承的一箭双雕
开发语言·jvm·c++
机器视觉知识推荐、就业指导21 分钟前
QML 批量创建模块 【Repeater】 组件详解
前端·c++·qml
ゞ 正在缓冲99%…27 分钟前
leetcode75.颜色分类
java·数据结构·算法·排序
橙橙子2301 小时前
c++柔性数组、友元、类模版
开发语言·c++·柔性数组
奋进的小暄1 小时前
贪心算法(15)(java)用最小的箭引爆气球
算法·贪心算法
Scc_hy1 小时前
强化学习_Paper_1988_Learning to predict by the methods of temporal differences
人工智能·深度学习·算法
巷北夜未央1 小时前
Python每日一题(14)
开发语言·python·算法
javaisC1 小时前
c语言数据结构--------拓扑排序和逆拓扑排序(Kahn算法和DFS算法实现)
c语言·算法·深度优先
爱爬山的老虎1 小时前
【面试经典150题】LeetCode121·买卖股票最佳时机
数据结构·算法·leetcode·面试·职场和发展