C++实现二分查找:理解数组参数与指针的关系
需积分: 20 59 浏览量
更新于2024-09-16
收藏 32KB DOC 举报
"c++数据结构---二分查找"
在C++编程中,二分查找是一种高效的算法,常用于已排序的数据集。该算法通过不断缩小查找范围来定位目标值,其基本思想是每次比较中间元素与目标值,然后根据比较结果决定是在左半部分还是右半部分继续查找。这个过程一直持续到找到目标值或者搜索范围为空。
在这个例子中,我们有两个版本的`eFenChaZhao`函数,它们的主要区别在于参数的顺序。虽然在C++中,数组作为函数参数时会自动退化为指针,但函数的参数顺序不同可能会导致混淆。第一个函数定义为`int eFenChaZhao(int *arr, int lo, int k)`,而第二个版本交换了数组和长度的位置,即`int eFenChaZhao(int lo, int *arr, int k)`。在这两种情况下,`arr`都是数组的首地址,`lo`表示数组的长度,`k`是要查找的元素。
`eFenChaZhao`函数的实现遵循了经典的二分查找算法:
1. 初始化两个指针`low`和`high`,分别表示当前查找范围的起始和结束索引。
2. 在`while`循环中,只要`low`不大于`high`,就执行以下步骤:
- 计算中间索引`mid`,即`low`和`high`的平均值向下取整。
- 检查中间元素`arr[mid]`是否等于目标值`k`,如果相等则返回`mid`作为结果。
- 如果中间元素大于目标值,那么目标值可能在左半部分,将`high`更新为`mid - 1`。
- 否则,目标值可能在右半部分,将`low`更新为`mid + 1`。
3. 当`while`循环结束后,如果未找到目标值,则返回0表示失败。
在`main`函数中,首先创建了一个整数数组`a`,并计算了它的长度`lo`。然后调用`eFenChaZhao`函数寻找数值66的位置。注意这里可以灵活地调整函数参数的顺序,因为数组作为参数会自动转换为指针。如果函数返回0,表示未找到目标值;否则,输出66所在的索引位置。
为了提高代码可读性和效率,可以对`eFenChaZhao`函数进行一些改进,例如:
1. 使用类型安全的`size_t`类型表示数组长度,避免可能出现的整数溢出问题。
2. 考虑边界情况,如当查找长度为0时,应该直接返回0,无需进行查找。
3. 在查找过程中,可以考虑在找到目标值后立即跳出循环,避免不必要的比较。
改进后的代码可能如下所示:
```cpp
#include <iostream>
#include <cstddef>
int eFenChaZhao(int *arr, size_t lo, int k) {
if (lo == 0) return 0;
size_t low = 0, high = lo - 1;
while (low <= high) {
size_t mid = low + (high - low) / 2;
if (arr[mid] == k) {
return mid;
} else if (arr[mid] > k) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return 0;
}
int main() {
int a[] = {11, 2, 4, 35, 5, 66, 100, 22, 369, 1588, 89};
size_t lo = sizeof(a) / sizeof(a[0]);
std::cout << "数组长度:" << lo << std::endl;
int p = eFenChaZhao(a, lo, 66);
if (p == 0) {
std::cout << "找不到!!!" << std::endl;
} else {
std::cout << "66所在的位置:" << p << std::endl;
}
return 0;
}
```
这样的改进使代码更加健壮,同时保持了二分查找算法的核心效率。在实际应用中,二分查找算法不仅适用于静态数组,还可以应用于动态数据结构,如平衡二叉搜索树或某些支持高效随机访问的操作系统内核数据结构。
2009-10-24 上传
2012-05-03 上传
2010-04-02 上传
2010-09-25 上传
2024-06-17 上传
2012-10-01 上传
XIECSDN
- 粉丝: 0
- 资源: 11
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章