C++ 中二分查找递归非递归实现并分析

发布时间 - 2026-01-11 01:44:49    点击率:

C++ 中二分查找递归非递归实现并分析

二分查找在有序数列的查找过程中算法复杂度低,并且效率很高。因此较为受我们追捧。其实二分查找算法,是一个很经典的算法。但是呢,又容易写错。因为总是考虑不全边界问题。

用非递归简单分析一下,在编写过程中,如果编写的是以下的代码:

#include<iostream>
#include<assert.h>
using namespace std;

int binaty_search(int* arr, size_t n, int x)
{ 
  assert(arr);
  int left = 0;
  int right = n - 1;

  while (left <= right)
  {
    int mid = (left + right) / 2;
    if (x < arr[mid])
    {
      right = mid-1;
    }
    else if (x > arr[mid])
    {
      left = mid+1;
    }
    else
    return mid;
  }
  return -1;
}

int main()
{
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 0) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 1) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 2) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 3) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 4) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 5) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 6) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 7) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 8) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 9) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 10) << endl;
    return 0;
}

那么我们可以简单分析一下:

如果是以下这样的代码实现:

#include<iostream>
#include<assert.h>
using namespace std;

int binaty_search(int* arr, size_t n, int x)
{
  assert(arr);
  int left = 0;
  int right = n;

  while (left < right)
  {
    int mid = (left + right) / 2;
    if (x < arr[mid])
    {
      right = mid;
    }
    else if (x > arr[mid])
    {
      left = mid + 1;
    }
    else
      return mid;
  }
  return -1;
}
int main()
{
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 0) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 1) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 2) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 3) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 4) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 5) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 6) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 7) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 8) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 9) << endl;
  cout << binaty_search(arr, sizeof(arr) / sizeof(int), 10) << endl;
    return 0;
}

那么可以简单分析一下为:

同样,递归实现的条件也分为两种,我就只演示一种,代码如下:

#include<iostream>
#include<assert.h>
using namespace std;

int binaty_srarch(int* arr, int x, int left, int right)
{
  assert(arr);
  int mid;
  if (left <= right)
  {
    mid = (left + right) / 2;
    if (arr[mid] == x)
    {
      return mid;
    }
    else
    if (x < arr[mid])
    {
      return binaty_srarch(arr, x, left, right - 1);
    }
    else if (x>arr[mid])
    {
      return binaty_srarch(arr, x, left + 1, right);
    }
  }
  return -1;
}

int main()
{
  int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  cout << binaty_srarch(arr, 0, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 1, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 2, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 3, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 4, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 5, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 6, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 7, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 8, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 9, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;
  cout << binaty_srarch(arr, 10, 0, (sizeof(arr) / sizeof(int)) - 1) << endl;

  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 二分查找  # 二分查找递归非递归  # 查找算法之二分查找的C++实现  # C++二分查找算法实例  # C++二分查找(折半查找)算法实例详解  # 二分查找算法在C/C++程序中的应用示例  # python中二分查找法的实现方法  # python实现二分查找算法  # Pythonic版二分查找实现过程原理解析  # Python如何实现的二分查找算法  # c++与python实现二分查找的原理及实现  # 递归  # 过程中  # 的是  # 是一个  # 我就  # 两种  # 我们可以  # 很高  # 希望能  # 谢谢大家  # 不全  # include  # cpp  # lt  # gt  # iostream  # strong  # br  # pre  # brush 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用好域名打造高点击率的自主建站?  JavaScript实现Fly Bird小游戏  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  jquery插件bootstrapValidator表单验证详解  js实现获取鼠标当前的位置  JavaScript如何实现音频处理_Web Audio API如何工作?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  javascript中的try catch异常捕获机制用法分析  如何快速搭建支持数据库操作的智能建站平台?  如何快速搭建高效WAP手机网站吸引移动用户?  详解Android图表 MPAndroidChart折线图  Android利用动画实现背景逐渐变暗  ,交易猫的商品怎么发布到网站上去?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  如何用搬瓦工VPS快速搭建个人网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  如何在阿里云ECS服务器部署织梦CMS网站?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  在Oracle关闭情况下如何修改spfile的参数  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  如何在万网自助建站中设置域名及备案?  如何在橙子建站上传落地页?操作指南详解  Laravel如何实现模型的全局作用域?(Global Scope示例)  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  韩国服务器如何优化跨境访问实现高效连接?  如何在IIS服务器上快速部署高效网站?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  如何快速生成专业多端适配建站电话?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  香港服务器建站指南:免备案优势与SEO优化技巧全解析  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  如何安全更换建站之星模板并保留数据?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  网站页面设计需要考虑到这些问题  javascript日期怎么处理_如何格式化输出  网站制作软件免费下载安装,有哪些免费下载的软件网站?  魔方云NAT建站如何实现端口转发?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel怎么为数据库表字段添加索引以优化查询  JavaScript中如何操作剪贴板_ClipboardAPI怎么用