二分法的C++实现

在计算机科学和算法中,搜索是一项常见的任务。当数据集较大时,线性搜索可能会变得低效,因此我们需要一种更高效的搜索算法。二分搜索算法是一种强大的工具,它利用有序数据集的特性,在每次比较中将搜索空间缩小一半。本篇博客基于代码随想录第三章编写。

 

什么是二分搜索算法? 二分搜索算法,也称为折半搜索算法,是一种高效的查找算法。它基于以下两个前提条件:

  • 数据集必须有序:二分搜索算法要求数据集按照某种顺序排列,通常是升序或降序排列。
  • 数据集必须是随机访问的:二分搜索算法需要能够通过索引访问数据集中的元素,因此它通常与数组或类似结构一起使用。

工作步骤:

  • 确定搜索空间的上界和下界。(left and right)
  • 计算中间元素的索引。(middle)
  • 将中间元素与目标元素进行比较。
  • 如果中间元素等于目标元素,则搜索完成。
  • 如果中间元素大于目标元素,则在左侧子数组中继续搜索。
  • 如果中间元素小于目标元素,则在右侧子数组中继续搜索。
  • 重复以上步骤,直到找到目标元素或搜索空间为空

优势和局限性:

  •  二分搜索算法的主要优势在于它的时间复杂度为O(log n),其中n是数据集的大小。相比于线性搜索算法的O(n)时间复杂度,二分搜索算法具有更高的效率。然而,二分搜索算法也有一些局限性,比如它只能应用于有序数据集,并且对随机访问的数据结构有要求。
#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
using namespace std;

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int ret = -1;
        int left = 0;
        int right = nums.size() - 1;
        
        while (left < right)
        {
            int middle = left + (right - left)/2 ;
            if (nums[middle] == target)
            {
                ret = middle;
                return ret;
            }
            else if(nums[middle] > target) 
            {
                right = middle - 1;
            }
            else 
            {
                left = middle + 1;
            }
        } 
        return ret;
    }
    int search2(vector<int>& nums,int left,int right, int target) 
    {
        int ret = -1;
        while(left < right)
        {
            int middle = (right - left) / 2;
            if (nums[middle] == target)
            {
                ret = middle;
                return ret;
            }
            else if (nums[middle] < target)
            {
                search2(nums,middle+1,right,target);
            }
            else
            {
                search2(nums,left,middle-1,target);
            }
        }
        return ret;
    }
};

int main()
{
    int n = 10;
    std::vector<int> values;
    values.push_back(1);
    values.push_back(2);
    values.push_back(3);
    values.push_back(4);
    values.push_back(5);
    values.push_back(5);
    values.push_back(5);
    values.push_back(5);
    values.push_back(5);
    values.push_back(5);
    int middle = values.size() / 2;
    Solution s = Solution();
    auto startTime = chrono::high_resolution_clock::now();
    int ret = s.search2(values,0,values.size()-1,3);
    auto endTime = chrono::high_resolution_clock::now();
    chrono::duration<double, std::nano> fp_ms = endTime - startTime;
    cout << "my answer is " << ret << "\n" << "my time is:" << fp_ms.count() << "ms" << endl;
    // for(int i = 0;i < n; i++)
    // {
    //     int x = 0;
    //     std::cin >> x;
    //     values.push_back(x);
    // }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值