数据结构之二分查找
二分查找#
简要记录:二分查找是一种非常容易想到的查找方法,我最早接触到的二分思想就是“一尺之捶,日取其半,万世不竭”,中学里寻找零点也是依靠的二分法,因此,掌握好二分查找对于学习提升很重要,这也是我在看到其他大佬的博客后对于学习的一些体会记录,也便于更好掌握二分查找。
二分查找的要求#
- 查找序列要是有序的
- 只能查找单个元素
代码实现#
#include<iostream>
using namespace std;
typedef int Elemtype;
//二分查找
int BinSerch(Elemtype arr[], int n, Elemtype data);
//int main()
//{
// Elemtype arr[10] = { 2,4,6,8,10,12,14,16,20,22 };
// for (int i = 0; i < 10; i++)
// cout << BinSerch(arr, 10, arr[i]) << endl;
// /*
// 打印:
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 一组供测试的数据
// */
// return 0;
//}
//
//二分查找
int BinSerch(Elemtype arr[], int n, Elemtype data)
{
int left = 0, right = n - 1; //定义左右哨兵
int mid = (right - left) / 2 + left;//定义二分的中间哨兵
/*
这里使用(right - left) / 2 + left 是为了防止 (right+left)/2 会溢出int类型
*/
while (left <= right) //二分循环的条件
{
mid = (right - left) / 2 + left;//每次循环都对中间哨兵更新
if (arr[mid] == data)
return mid; //找到对应值后返回对应下标
else if (arr[mid] > data) //查找的data小于中间哨兵对应的值,因此排除大于中间哨兵的值
right = mid - 1; //更新右哨兵,将右哨兵移动到中间哨兵左边一位
else //查找的data大于中间哨兵对应的值,因此排除小于中间哨兵的值
left = mid + 1; //更新左哨兵,将左哨兵移动到中间哨兵右边一位
}
return -1; //没有找到对应的data值,因此返回 -1
}
作者:墨鱼-yyyl
出处:https://www.cnblogs.com/moyu-yyyl/p/18009711
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话