二分查找(折半查找)简介与代码实现

  • 1.简介
  • 2.代码实现(C++)
    • 2.1.写法一(target在左闭右闭区间)
    • 2.2.写法二(target在左闭右开区间)
  • 3.代码检验

1.简介

二分查找的本质:

首先确定待查元素所在的范围,然后逐步缩小范围(区间),直到查找到元素或者查找失败为止。

二分查找的前提:

数组必须是有序的

2.代码实现(C++)

2.1.写法一(target在左闭右闭区间)

1.因为left与right相等的情况在[left,right]区间有意义,所以在while(left <= right)中要使用<=
2.如果nums[middle]大于target,则更新搜索范围右下标right为middle - 1。因为接下来要查找的左区间结束下标的位置是middle - 1。
//版本一
class Solution1 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右闭的区间,即[left,right]int right = nums.size() - 1;//当left==right时,[left,right]区间依然有效,所以使用<=while (left <= right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle - 1;//target在左区间[left,middle-1]}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right]}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};

2.2.写法二(target在左闭右开区间)

1.因为left与right相等的情况在[left,right]区间没有意义,所以在while(left < right)中要使用<
2.如果nums[middle] 大于 target ,则 right 更新为 nums[middle]
//版本二
class Solution2 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右开的区间,即[left,right)int right = nums.size();//当left==right时,[left,right),是无效空间,所以使用<while (left < right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) >> 1 );if (nums[middle] > target) {right = middle;//target在左区间[left,middle)}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right)}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};

3.代码检验

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;//版本一
class Solution1 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右闭的区间,即[left,right]int right = nums.size() - 1;//当left==right时,[left,right]区间依然有效,所以使用<=while (left <= right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle - 1;//target在左区间[left,middle-1]}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right]}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};//版本二
class Solution2 {public:int search(vector<int>& nums, int target) {int left = 0;//定义target在左闭右开的区间,即[left,right)int right = nums.size();//当left==right时,[left,right),是无效空间,所以使用<while (left < right) {//防止溢出,等同于(left+right)/2int middle = left + ((right - left) >> 1 );if (nums[middle] > target) {right = middle;//target在左区间[left,middle)}else if (nums[middle] < target) {left = middle + 1;//target在右区间[middle+1,right)}else {//nums[middle]==targetreturn middle;//在数组中找到目标值,直接返回下标}}//未找到目标值return -1;}
};int main() {//创建数组vector<int>arr;//为数组添加元素cout << "查找temp最后被赋值的元素在排序后的数组中的位置" << endl;cout << "添加到数组内的元素:" << endl;int temp = 0;//查找temp最后被赋值的元素在排序后的数组中的位置for (int i = 0; i < 10; i++) {temp = rand() % 101;arr.push_back(temp);cout << temp << " ";}cout << endl;//为数组排序sort(arr.begin(), arr.end());cout << "输出排序后的数组" << endl;for (int i = 0; i < arr.size(); i++) {cout << arr.at(i) << " ";}cout << endl;//分别使用两种二分查找,查找temp最后被赋值的元素在排序后的数组中的位置Solution1 S1;Solution2 S2;cout << "使用方法一,目标值的下标为:" << endl << S1.search(arr, temp) << endl;cout << "使用方法二,目标值的下标为:" << endl << S1.search(arr, temp) << endl;}

运行截图:

二分查找(折半查找)简介与代码实现(C++)相关推荐

  1. 二分查找/折半查找算法

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表 ...

  2. c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...

    数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...

  3. 顺序表查找+折半查找(二级)

    我们讲了各种数据 结构之后,比如讲了线性表了,讲了栈和队列,讲了树和二叉树,讲了图之后呢,我们最后还有两个专题,一个叫查找,一个叫排序,我们先看看查找,查找包括哪些内容啊,第一个线性表的查找,数组或者 ...

  4. Python二分查找/折半查找算法详解--(面试常考)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究)   二分查找也称折 ...

  5. swift版 二分查找 (折半查找)

    二分查找作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围之内,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找.废话少说,直接上代码,可复制粘贴直接出结果! import ...

  6. C语言数组查找(线性查找 折半查找)

    线性查找 #include <stdio.h> #include <math.h>void find_nine(int numbers[]) {int i;for(i = 0; ...

  7. 顺序查找 折半查找 二叉排序树

    1.顺序查找,折半查找,二叉排序树操作定义 SeqSearch.h #include<stdio.h> #define ARRAYLEN 8int source[]={69, 65, 90 ...

  8. php折半查找算法,二分查找 [折半查找] 算法 PHP 版

    查找表:就是同一类型的数据元素构成的数据集合 有静态表和动态表 本文实现PHP版的二分查找算法[本算法仅用于顺序存储的查找表] /** * Created by PhpStorm. * User: 1 ...

  9. DS查找—折半查找求阶乘函数后K个零

    题目描述 f(x) 是 x! 末尾是 0 的数量,给定 K,找出多少个非负整数 x ,能满足 f(x) = K . (x! = 1 * 2 * 3 * - * x,且 0! = 1 ) 例如, f(3 ...

  10. c语言实验报告 折半查找法,C语言数组之冒泡排序+折半查找法(二分查找)

    冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...

最新文章

  1. aptana手动配置python环境_Aptana Studio 3中通过Auto Config配置PyDev中Python出错
  2. 内存中有两个4字节以压缩的bcd_卷积神经网络的压缩与加速 -- 剪枝(PRUNING)论文(二)...
  3. mvn install java版本,maven的打包命令--assemblyinstall和maven update之后jdk版本变回1.5的问题...
  4. php把数据创建一个表格,PHP创建(导出Excel数据表格)
  5. 手机编译mysql_玩转MySQL 8.0源码编译
  6. shell编程入门步步高(九、sed和awk)
  7. CentOS 安装 rz sz
  8. prototype中文参数乱码解决方案
  9. 海外媒体稿件内容怎么写更出色
  10. ICLR 22 GIANT ,UIUC UCLA OGB榜单
  11. 快速入门solidity
  12. matlab 求矩阵的逆
  13. 你好,法语!A2知识点总结(1)
  14. HTML5APP商业开发实战教程——基于WeX5可视化开发平台
  15. JS中的CommonJS和AMD
  16. 王立柱《c语言》3.5.4
  17. 海底捞只要“面子”,不要“里子”?
  18. Kinect的介绍和应用【转】
  19. go 基于gin编写encode、decode、base64加密接口
  20. vue项目中集成腾讯TIM即时通讯(附源码)

热门文章

  1. 补码一位乘(布斯公式)
  2. 使用 JavaScript 的代价!(2018 版)
  3. 数据结构 (C++)笔记6 (有序列表 排序器)
  4. Linux ARM 静态网络配置
  5. Django分页,过滤:
  6. 【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2
  7. k8s指定node调度
  8. android 角度传感器,的Android传感器旋转角度
  9. springsecurity整合jwt实现授权认证,权限分配
  10. 如何制作wordpress短代码