二分搜索法 C++代码实现 恋上数据结构笔记
复习梗概
- 二分搜索法的end有两种定义方式,两种分别是什么含义?
- 二分搜索法end的两种定义方式分别影响了什么?(结束条件,更新指针)
- 二分搜索法的结束条件和更新指针两步代码?
- 二分搜索法的整体流程?
- 二分搜索法图解
- !!!我们不必纠结于二分搜索法mid =(begin+end)/2这个过程,middle是不是真的中间那一位,还是中间两位中的一个(偶数总数),因为是有序数组,严格比较大小缩小搜寻范围即可,mid差一两位没所谓根本
- 二分搜索法可以用于优化插入排序
二分搜索法是什么,时间复杂度
二分搜索法 : 用于寻找有序数组中的某个元素的位置 ,平均时间复杂度O(logn)(每次砍一半),没有稳定性
二分搜索法整体流程
- 初始化begin和end指针,初始化mid指针
- 若mid大于num,更新begin指针,mid小于num更新end指针(假设是递增序列)
- 若找到mid=num,退出并返回mid
- 若begin与end相遇或错过(视end定义而变),退出并返回没找到
- 循环上述
二分搜素法代码(end是数组末元素索引)
//!二分搜索法可以有两种写法,主要区别体现在end的定义,以及找不到元素结束搜索的条件(begin与end的位置关系)上
//! 比如下面这个,end的定义是被搜索那一块数组最后元素的索引
void binarySearch(vector<int> &array, int element)
{int begin = 0;//begin代表的是,查找数组中的第一个元素的索引,初始为0int end = array.size()-1;//end此时代表的是查找数组的最后一位元素索引while (begin <= end)//当begin与end错过时,查找数组中不再有任何元素,搜索结束{int middle = (begin + end) / 2;if (array[middle] == element){cout << "Search Success Index = " << middle << endl;return;}else if (element < array[middle]){end = middle -1;//更新end指针,指向新的搜索数组的末尾元素(不包括middle,所以要-1)}else if (element > array[middle]){begin = middle + 1;//更新begin指针,指向新的搜索数组的首元素(不包括middle,所以要+1)} }cout<<"Element Not Find"<<endl;return;
}
输入数组:
1 4 6 8 11 15 29 31
二分搜索基础版
搜索 19
Element Not Find
算法用时:(微秒)
[AlgoTime: 2000 us]
搜索完成
二分搜索法代码(end是数组末元素索引+1)
//! 下面这个,end的定义是被搜索那一块数组最后元素的索引+1
void binarySearch(vector<int> &array, int element)
{int begin = 0;//begin代表的是,查找数组中的第一个元素的索引,初始为0int end = array.size();//!这里需要注意,二分搜索法里的end不是数组最后的索引啦,是查找数组的最后一位的索引+1,初始值等于数组长度,是为了什么?while (begin < end)//当begin与end相等时,查找数组中不再有任何元素,搜索结束,画个图就明白了{int middle = (begin + end) / 2;if (array[middle] == element){cout << "Search Success Index = " << middle << endl;return;}else if (element < array[middle]){end = middle;//更新end指针,指向新的搜索数组的末尾元素的后一位(就是middle,所以不用-1)}else if (element > array[middle]){begin = middle + 1;} }cout<<"Element Not Find"<<endl;return;
}
输入数组:
1 4 6 8 11 15 29 31
二分搜索基础版
搜索 29
Search Success Index = 6
算法用时:(微秒)
[AlgoTime: 4000 us]
搜索完成
完整代码
#include <iostream>
#include <vector>
#include "MeasureAlgoTime.hpp"
using namespace std;//二分搜索法 : 用于寻找有序数组中的某个元素的位置 ,平均时间复杂度O(logn)(每次砍一半),没有稳定性void vectorPrint(vector<int> &array)
{for (int i = 0; i < array.size(); i++){cout << array[i] << ' ';}cout << endl;
}//!二分搜索法可以有两种写法,主要区别体现在end的定义,以及找不到元素结束搜索的条件(begin与end的位置关系)上
//! 比如下面这个,end的定义是被搜索那一块数组最后元素的索引
void binarySearch(vector<int> &array, int element)
{int begin = 0;//begin代表的是,查找数组中的第一个元素的索引,初始为0int end = array.size()-1;//end此时代表的是查找数组的最后一位元素索引while (begin <= end)//当begin与end错过时,查找数组中不再有任何元素,搜索结束{int middle = (begin + end) / 2;if (array[middle] == element){cout << "Search Success Index = " << middle << endl;return;}else if (element < array[middle]){end = middle -1;//更新end指针,指向新的搜索数组的末尾元素(不包括middle,所以要-1)}else if (element > array[middle]){begin = middle + 1;//更新begin指针,指向新的搜索数组的首元素(不包括middle,所以要+1)} }cout<<"Element Not Find"<<endl;return;
}//! 下面这个,end的定义是被搜索那一块数组最后元素的索引+1
void binarySearch1thRE(vector<int> &array, int element)
{int begin = 0;//begin代表的是,查找数组中的第一个元素的索引,初始为0int end = array.size();//!这里需要注意,二分搜索法里的end不是数组最后的索引啦,是查找数组的最后一位的索引+1,初始值等于数组长度,是为了什么?while (begin < end)//当begin与end相等时,查找数组中不再有任何元素,搜索结束,画个图就明白了{int middle = (begin + end) / 2;if (array[middle] == element){cout << "Search Success Index = " << middle << endl;return;}else if (element < array[middle]){end = middle;//更新end指针,指向新的搜索数组的末尾元素的后一位(就是middle,所以不用-1)}else if (element > array[middle]){begin = middle + 1;} }cout<<"Element Not Find"<<endl;return;
}int main()
{Tools::Time::AlgoTimeUs time1;Tools::Time::AlgoTimeUs time2;Tools::Time::AlgoTimeUs time3;vector<int> array;array = {1,4,6,8,11,15,29,31};vector<int> array2 = array;vector<int> array3 = array;cout << "输入数组:" << endl;time1.start();vectorPrint(array);cout << "二分搜索基础版" << endl;binarySearch(array,19);cout << "算法用时:(微秒)";time1.printElapsed();cout << "搜索完成"<< endl;cout << "输入数组:" << endl;time2.start();vectorPrint(array2);cout << "二分搜索基础版" << endl;binarySearch1thRE(array2,29);cout << "算法用时:(微秒)";time1.printElapsed();cout << "搜索完成"<< endl;return 0;
}
二分搜索法 C++代码实现 恋上数据结构笔记相关推荐
- 插入排序算法 及其二分搜索优化版 C++代码实现 恋上数据结构笔记
复习梗概 文章目录 复习梗概 插入排序算法思想 插入排序时间复杂度与特性(多少,与什么有关?) 插入排序基础版 插入排序2nd优化版(优化了哪里?) !!!插入排序二分搜索优化版(优化了哪里?如何优化 ...
- 归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记
复习梗概 画图,自己整个数组,看代码写步骤,这个对理解归并排序还是很有必要的 合并两个有序数组的merge函数写法 时间复杂度的分析方法!!! 其实我觉得去b站找个动态的步骤分解视频也是不错的复习方法 ...
- 基数排序及其思想 C++代码实现及分析 恋上数据结构笔记
文章目录 复习梗概 算法思想 时间及空间复杂度 基数排序基础版代码 及输出结果 计数排序函数 基数排序函数 可视化输出 另一种思路 完整版代码 复习梗概 思想 如何取数字各个位位数 计数排序保证稳定性 ...
- 计数排序及其改进 C++代码实现与分析 恋上数据结构笔记
文章目录 复习梗概 算法思想 基础思想 改进空间复杂度,改进不能对负数进行排序问题 改进稳定性 计数排序时间空间复杂度 计数排序基础版 代码及输出 计数排序第一次改进版 代码及输出 计数排序终极版 代 ...
- 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...
- 堆排序 C++代码实现及思想 排序过程输出 恋上数据结构笔记
复习梗概 文章目录 复习梗概 什么是堆思想? 堆排序算法怎么来的? 什么是下滤?代码 什么是建堆?代码 堆排序本体 代码及排序过程输出 和时间复杂度 完整代码 什么是堆思想? 最大堆:树形结构,每一个 ...
- 2021-10-15 红黑树 概念和平衡操作理解以及与AVL对比分析 恋上数据结构笔记
文章目录 红黑树的由来 红黑树需要遵守的五大规则 红黑树与4阶B树的相互转换!! 红黑树的插入(12种情况) 红黑树的删除(3大类情况) 红黑树的平衡 以及与AVL树的性能比较 红黑树的由来 红黑树: ...
- 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)
b站有个up讲的很详细 https://www.bilibili.com/video/BV1xE411h7dd?from=search&seid=11383601726930144190&am ...
- 希尔排序(缩小增量排序)(插入排序的优化版) C++代码实现及算法分析 恋上数据结构笔记
文章目录 复习概要 算法思想 算法流程 算法复杂度分析及稳定性 希尔排序代码正常版 希尔排序与插入排序代码对比 希尔排序个人青春版(别看以免走上歧途) 复习概要 算法思想与流程 分这么多组分别插入排序 ...
最新文章
- 直播 | 北京邮电大学助理教授王啸:网络嵌入的最新进展
- CF767C Garland
- java 代码块 作用_Java核心(三):代码块的作用
- QT安装配置是注意事项
- vmvare连接linux
- 解密:90后程序员青睐哪些互联网公司?
- SAP License:转一篇初学者必看的文章
- TraceEventsDB event(跟踪事件)总结
- Eclpise 和 MyEclipse 的区别
- AntTweakBar with OpenGL
- docker-compose部署nacos 集群超过2个容器的问题
- MPQ4420HGJ DCDC电源设计+SIMetrix+Spice仿真模型
- 【题解】P2916 [USACO08NOV]安慰奶牛Cheering up the Cow-C++
- 计算机组成原理alu_b什么意思,计算机组成原理实验三多功能ALU设计实验(5页)-原创力文档...
- overlay的设计
- #include<set>头文件的用法
- 关于到年底日常生活的工作计划
- 511遇见易语言流程控制返回和结束和销毁
- 51nod 1431 快乐排队
- 论MMORPG游戏服务器架构
热门文章
- 基于FTP的Nordic nRF51822 OTA 教程一之修改boot区大小
- ESP8266的一个小问题
- 209计算机考试题库,计算机考试题库:计算机考试模拟练习题(209)
- EOS 智能合约源代码解读 (14)system合约“exchange_state.hpp”
- 区块链系统之《一种基于区块链的云数据共享方法》
- buu [BJDCTF 2nd]燕言燕语-y1ng
- 用正则表达式匹配网址URL中最后一个反斜杠/后面的内容
- 【Prometheus】prometheus生成快照,并冷备份数据,恢复数据
- 10、MySQL权限控制实现原理
- 1.3 继承(extends)