首页 > 编程语言 >算法设计与分析(二分查找算法

算法设计与分析(二分查找算法

时间:2024-09-19 12:23:10浏览次数:8  
标签:二分 right middle 算法 查找 left



目录

  • 二分查找算法详解
  • 引言
  • 算法步骤
  • 代码实现
  • 注意事项
  • 结论
  • 小结:


二分查找算法详解

引言

二分查找算法是一种在有序数组中查找特定元素的搜索算法。它通过不断将数组分成两半,缩小搜索范围,从而快速定位到目标元素的位置。二分查找算法的时间复杂度为O(log n),其中n是数组的长度。

算法步骤

  1. 初始化:设置两个指针leftright,分别指向数组的首尾元素。
  2. 循环查找:当left小于等于right时,执行循环。
  • 计算中间位置middle = (left + right) / 2
  • 如果a[middle]等于目标值x,则返回middle作为结果。
  • 如果a[middle]小于x,则说明目标值在右侧,更新left = middle + 1
  • 如果a[middle]大于x,则说明目标值在左侧,更新right = middle - 1
  1. 未找到:如果循环结束仍未找到目标值,则返回-1表示未找到。

代码实现

以下是二分查找算法的一个C++实现示例:

#include<iostream>  
  
using namespace std;  
  
// 二分查找函数  
int BinarySearch(int a[], int x, int n){	// 在a[0...n-1]中搜索x,返回索引   
	int left = 0;  
	int right = n - 1;  
	  
	while (left <= right){	// 合法区间   
		int middle = (left + right) / 2; // 注意:这里可能存在整数溢出问题,更安全的写法是 middle = left + (right - left) / 2;  
		if (x == a[middle]){  
			return middle;  
		}  
		else if (x > a[middle]){  
			left = middle + 1;  
		}  
		else{  
			right = middle - 1;  
		}  
	}  
	  
	return -1;	// 没找到x   
}  
  
int main() {  
	int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  
	cout << "元素3的索引为:" << BinarySearch(a, 3, 10) << endl;  
	return 0;  
}

注意事项

数组有序:二分查找算法要求数组必须是有序的。

整数溢出:在计算中间位置时,(left + right) / 2可能会因为left和right都很大而导致整数溢出。更安全的写法是middle = left + (right - left) / 2;。

边界条件:在循环中,需要确保left始终小于等于right,以避免数组越界。

结论

二分查找算法是一种高效的搜索算法,特别适用于有序数组的查找。通过不断缩小搜索范围,二分查找能够在O(log n)的时间复杂度内找到目标元素或确定目标元素不存在。希望本文能够帮助您更好地理解二分查找算法。

标签:二分,right,middle,算法,查找,left
From: https://blog.51cto.com/u_16672541/12055879

相关文章

  • 分类预测 | Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测
    分类预测|Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测目录分类预测|Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料分类效果基本描述1.Matlab实现SMA-CNN-SVM黏菌算法优化卷积支持向量机分类预......
  • 算法学习-Dancing Links X
    DancingLinksX舞蹈链。实质为用循环十字链在图上将所有“1”的位置链起来构造较为巧妙,且极易理解,本题为DLX模板(精确覆盖问题)DLX算法的题目做法一般为将所求方案转化为行号,将限制条件转化为列号然后dfs暴力枚举,用循环十字链优化/*Finishedat12:14on2024.4.5*/#......
  • 算法学习-CDQ分治
    对于二维偏序,为普通的求逆序对,只需要先排序一遍,然后树状数组或双指针即可而三位偏序甚至更高,则需要用CDQ分治,简单来说,就是将树状数组和双指针结合操作步骤如下:1.开始将数组按第一维排序,保证满足x性质2.在归并中,将左右分别按y排序,因为开始以x排序,所以保证了正确性,保证贡献从左......
  • 【算法】堆与优先级队列
    【ps】本篇有4道 leetcode OJ。目录一、算法简介二、相关例题1)最后一块石头的重量.1-题目解析.2-代码编写2)数据流中的第K大元素.1-题目解析.2-代码编写3)前K个高频单词.1-题目解析.2-代码编写4)数据流的中位数.1-题目解析.2-代码编写 一、算......
  • 多输入多输出 | Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测
    多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测目录多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料预测效果基本介绍多输入多输出|Matlab实现DBO-BP蜣螂算法优化BP神经网络多输入......
  • 一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention
    一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention目录一区霜冰算法+双向深度学习模型+注意力机制!RIME-BiTCN-BiGRU-Attention效果一览基本介绍程序设计参考资料效果一览基本介绍1.Matlab实现RIME-BiTCN-BiGRU-Attention霜冰算法优化双向时间卷积双向门控循环......
  • 顶刊算法 | Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变
    顶刊算法|Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比目录顶刊算法|Matlab实现鹈鹕算法POA-CNN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测,优化前后对比预测效果基本介绍程序设计参考资料预测效果基本......
  • CNN-SVM模型 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分
    CNN-SVM模型|Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分类预测目录CNN-SVM模型|Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料分类效果基本描述1.Matlab实现SO-CNN-SVM蛇群算法优化......
  • 二叉 查找 树
    目录WhyneedBinaryTree?树也是节点结构规定术语树的创建树的查找查找效率WhyneedBinaryTree?有时候,我们希望数据按照特定顺序排列。比如:想要按字母顺序排列人名;按价格顺序排列产品;...树也是节点结构规定二叉树的每个节点的子节点数量都是0、1、2;每个节点最......
  • C++ 逆向之 main 函数的查找
    在整个程序的逆向分析过程中,寻找main函数是逆向分析过程的第一步,程序的主要逻辑从这里展开。这里面涉及到两个概念:用户入口(UserEntryPoint)和应用程序入口(ApplicationEntryPoint)。用户入口用户入口是开发者编写的用于程序开始的函数。对于大多数C/C++程序而言,这个入......