首页 > 编程语言 >二分搜索法-C++

二分搜索法-C++

时间:2023-08-19 15:11:20浏览次数:33  
标签:二分 right 下标 数字 int mid C++ 搜索 数组

二分法,就是对一个数组中,已经排好序的数字进行搜索。

使用二分法的前提条件:

1.是一个数组

2.该数组中的数字已经是有序的,比如升序的数字或者降序的数字都可以。int a[]={1,2,3,4};     int b[]={4,3,2,1};

3.该数组中没有出现重复的数字

 

二分法原理:

就是对一个数组,不断的划分出一个一个的区间,不断的缩小区间的范围,直至找到该数字为止。

比如:现在有一个数组  int a[] = {1,2,3,4,5,6,7,8,9,10};

需要查找的数字是 :9

如果使用常规方法,就是对数组下标进行遍历,如果找到则输出下标,然后结束循环。但是这样子需要循环9次才能得到结果。

for(int i = 0;i<10;i++){

  if(a[i]==9){

    cout<<i;

    break;

  }

}

 

但是会发现有一个问题,当数字很多的时候,1000万个,1亿个数字的时候,甚至更多n个数字的时候,极限情况需要循环1000万、1亿次、n次,是挺消耗时间的。

但是使用二分法需要的时间只需要log2n次即可,大大缩减了循环次数。

 

下面是使用二分法思路来解决这个问题:

第一步:当前查找的下标范围是 a[0]---a[9],这时候的中间位置的数字是a[0+(9-0)/2]=a[4]=5。

a[4]<9,也就是说明a[0]----a[4]之间的数字肯定也是小于9的,所以下一步就可以直接看a[5]------a[9]这个区间的数字

 

第二步:当前查找的下标范围是a[5]------a[9],这时候的中间位置的数字是a[5+(9-5)/2]=a[7]=8。

a[7]<9,也就是说明a[5]----a[7]之间的数字肯定也是小于9的,所以下一步就可以直接看a[8]------a[9]这个区间的数字

 

第三步:当前查找的下标范围是a[8]------a[9],这时候的中间位置的数字是a[8+(9-8)/2]=a[8]=9。

a[8]=9,也就是刚好查找到了,并且所在的位置是下标8

二分结束!

 

例题:给定一个有序数组,对该数组进行查找一个数字是否存在,是的话返回该数字所在的位置,不是的话则返回-1。

//target 查找的目标数字
//left左边区间的下标
//right右边区间的下标
int er_search(int a[],int target,int left,int right){
  while(left<=right){
    int mid = left+(right-left)/2;//当前从左到右的区间的中间位置
    if(a[mid] == target){

      return mid;
    }
    else if(a[mid]<target){
      left = mid+1;
         //mid+1的原因是a[mid]小于target,
      //所以下一步不需要从a[mid]----a[right] 这个范围内去找了
      //应该可以直接从 从a[mid+1]----a[right] 这个范围内去找了
    }
  else{
     //这里与上面同理
      right= mid-1;
   }
  }
  return -1;
}

 

标签:二分,right,下标,数字,int,mid,C++,搜索,数组
From: https://www.cnblogs.com/zzjivy/p/17642247.html

相关文章

  • C++问题汇总
    一、执行C++程序报错1、现象#现象./gtest_W:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.20'notfound(requiredby./gtest_W)./gtest_W:/lib64/libstdc++.so.6:version`CXXABI_1.3.9'notfound(requiredby./gtest_W)./gtest_W:/lib64/libstdc++.so.6:version......
  • C++入门到放弃(11)——继承
    ​继承是面向对象编程语言当中,最重要的部分,也是代码重用的一种重要形式。不知道为啥不能添加代码了,全部只能用图片替代了。1.基本形式首先继承的有三种基本形式,分别是public、private、protected,代表公有继承、私有继承和保护继承,之前在介绍作用范围的时候提过这三者的区别,但这......
  • 基于Redis的Geo实现附近商铺搜索(含源码)
    微信公众号访问地址:基于Redis的Geo实现附近商铺搜索(含源码)一、GEO常用命令及使用示范1.1、GEO的数据结构GEO 就是 Geolocation 的简写形式,代表地理坐标。Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。常见的命令有:1、GEOAD......
  • VScode软件的安装以及C/C++环境配置的方法
    今天和大家分享一下VScode软件的安装以及C/C++环境配置的方法。手把手教大家入门。1,下载VScode编译器(1)   官网下载链接:https://code.visualstudio.com/ (2)安装VScode。安装过程中的附加任务建议全部勾选。 至此VScode安装完成 2,下载编译器MinGW。(1)下载地址:https:......
  • 剑指 Offer 54. 二叉搜索树的第k大节点
    方法一:由于是有序的平衡二叉树,因此是中序。根据dfs中序迭代求得递增排序后,再反转就可求得结果。classSolution{public:vector<int>tmp;intkthLargest(TreeNode*root,intk){//if(root!=NULL)returndfs(root);reverse(tmp.be......
  • c++ 多线程
    #include<iostream>#include<functional>#include<thread>#include<future>//std::promise,std::future#include<chrono>voidprint_int(std::future<int>&fut){intx=fut.get();......
  • 如何在C++程序中借助Windows自带的bitsadmin命令从123云盘(不开通直链或会员)上下载文件
    最近,我想发布一个程序,里面想嵌入一些比较大的文件,但是如果直接用资源方式嵌入的话程序的体积就非常大,所以我想用从网上下载的方式获取这些文件。之前我试过很多方式,都没有成功,最后找到了这种方式...准备工作:先了解一下bitsadmin命令的语法,详见官方文档https://learn.microsof......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    本题比较重要的有两点:1.一般认为有序的二叉搜索树,都是中序遍历。2.中序遍历的递归顺序,得到的就是排好序的,就是链表的顺序,因此只需管遍历的过程中的链表指向即可。classSolution{public://pre将来指向尾节点,head指向头节点Node*pre=nullptr,*head=nullptr;......
  • c++[1]
    命名空间:为什么要使用命名空间?使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,于是就有了关键字namespace举个例子:#include<iostream>#include<stdlib.h>//头文件中包含rand函数的定义intrand=10;//命名冲突intmain(){ printf("%d",rand);......
  • C++中String的语法及常用接口用法
    在C语言中,string是一个标准库类(class),用于处理字符串,它提供了一种更高级、更便捷的字符串操作方式,string 类提供了一系列成员函数和重载运算符,以便于对字符串进行操作和处理。一、string类在学习string前,我们不妨先来了解一下string类到底是什么,有什么用呢?我们先来了解一下基本......