复习梗概

  1. 二分搜索法的end有两种定义方式,两种分别是什么含义?
  2. 二分搜索法end的两种定义方式分别影响了什么?(结束条件,更新指针)
  3. 二分搜索法的结束条件和更新指针两步代码?
  4. 二分搜索法的整体流程?
  5. 二分搜索法图解
  6. !!!我们不必纠结于二分搜索法mid =(begin+end)/2这个过程,middle是不是真的中间那一位,还是中间两位中的一个(偶数总数),因为是有序数组,严格比较大小缩小搜寻范围即可,mid差一两位没所谓根本
  7. 二分搜索法可以用于优化插入排序

二分搜索法是什么,时间复杂度

二分搜索法 : 用于寻找有序数组中的某个元素的位置 ,平均时间复杂度O(logn)(每次砍一半),没有稳定性


二分搜索法整体流程

  1. 初始化begin和end指针,初始化mid指针
  2. 若mid大于num,更新begin指针,mid小于num更新end指针(假设是递增序列)
  3. 若找到mid=num,退出并返回mid
  4. 若begin与end相遇或错过(视end定义而变),退出并返回没找到
  5. 循环上述

二分搜素法代码(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++代码实现 恋上数据结构笔记相关推荐

  1. 插入排序算法 及其二分搜索优化版 C++代码实现 恋上数据结构笔记

    复习梗概 文章目录 复习梗概 插入排序算法思想 插入排序时间复杂度与特性(多少,与什么有关?) 插入排序基础版 插入排序2nd优化版(优化了哪里?) !!!插入排序二分搜索优化版(优化了哪里?如何优化 ...

  2. 归并排序算法 C++实现与时间复杂度(考过)恋上数据结构笔记

    复习梗概 画图,自己整个数组,看代码写步骤,这个对理解归并排序还是很有必要的 合并两个有序数组的merge函数写法 时间复杂度的分析方法!!! 其实我觉得去b站找个动态的步骤分解视频也是不错的复习方法 ...

  3. 基数排序及其思想 C++代码实现及分析 恋上数据结构笔记

    文章目录 复习梗概 算法思想 时间及空间复杂度 基数排序基础版代码 及输出结果 计数排序函数 基数排序函数 可视化输出 另一种思路 完整版代码 复习梗概 思想 如何取数字各个位位数 计数排序保证稳定性 ...

  4. 计数排序及其改进 C++代码实现与分析 恋上数据结构笔记

    文章目录 复习梗概 算法思想 基础思想 改进空间复杂度,改进不能对负数进行排序问题 改进稳定性 计数排序时间空间复杂度 计数排序基础版 代码及输出 计数排序第一次改进版 代码及输出 计数排序终极版 代 ...

  5. 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记

    文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...

  6. 堆排序 C++代码实现及思想 排序过程输出 恋上数据结构笔记

    复习梗概 文章目录 复习梗概 什么是堆思想? 堆排序算法怎么来的? 什么是下滤?代码 什么是建堆?代码 堆排序本体 代码及排序过程输出 和时间复杂度 完整代码 什么是堆思想? 最大堆:树形结构,每一个 ...

  7. 2021-10-15 红黑树 概念和平衡操作理解以及与AVL对比分析 恋上数据结构笔记

    文章目录 红黑树的由来 红黑树需要遵守的五大规则 红黑树与4阶B树的相互转换!! 红黑树的插入(12种情况) 红黑树的删除(3大类情况) 红黑树的平衡 以及与AVL树的性能比较 红黑树的由来 红黑树: ...

  8. 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)

    b站有个up讲的很详细 https://www.bilibili.com/video/BV1xE411h7dd?from=search&seid=11383601726930144190&am ...

  9. 希尔排序(缩小增量排序)(插入排序的优化版) C++代码实现及算法分析 恋上数据结构笔记

    文章目录 复习概要 算法思想 算法流程 算法复杂度分析及稳定性 希尔排序代码正常版 希尔排序与插入排序代码对比 希尔排序个人青春版(别看以免走上歧途) 复习概要 算法思想与流程 分这么多组分别插入排序 ...

最新文章

  1. 直播 | 北京邮电大学助理教授王啸:网络嵌入的最新进展
  2. CF767C Garland
  3. java 代码块 作用_Java核心(三):代码块的作用
  4. QT安装配置是注意事项
  5. vmvare连接linux
  6. 解密:90后程序员青睐哪些互联网公司?
  7. SAP License:转一篇初学者必看的文章
  8. TraceEventsDB event(跟踪事件)总结
  9. Eclpise 和 MyEclipse 的区别
  10. AntTweakBar with OpenGL
  11. docker-compose部署nacos 集群超过2个容器的问题
  12. MPQ4420HGJ DCDC电源设计+SIMetrix+Spice仿真模型
  13. 【题解】P2916 [USACO08NOV]安慰奶牛Cheering up the Cow-C++
  14. 计算机组成原理alu_b什么意思,计算机组成原理实验三多功能ALU设计实验(5页)-原创力文档...
  15. overlay的设计
  16. #include<set>头文件的用法
  17. 关于到年底日常生活的工作计划
  18. 511遇见易语言流程控制返回和结束和销毁
  19. 51nod 1431 快乐排队
  20. 论MMORPG游戏服务器架构

热门文章

  1. 基于FTP的Nordic nRF51822 OTA 教程一之修改boot区大小
  2. ESP8266的一个小问题
  3. 209计算机考试题库,计算机考试题库:计算机考试模拟练习题(209)
  4. EOS 智能合约源代码解读 (14)system合约“exchange_state.hpp”
  5. 区块链系统之《一种基于区块链的云数据共享方法》
  6. buu [BJDCTF 2nd]燕言燕语-y1ng
  7. 用正则表达式匹配网址URL中最后一个反斜杠/后面的内容
  8. 【Prometheus】prometheus生成快照,并冷备份数据,恢复数据
  9. 10、MySQL权限控制实现原理
  10. 1.3 继承(extends)