折半查找

2023-11-05

什么是折半查找?

折半查找其实通过字面上的意思就是大致就可以理解为每次查找的时候
选取中间下标的值进行查找.

如果找不到,就判断这个要查找的数大于还是小于这个这个中间下标的值.

如果大于,就把这个中间值的下标+1给到左边的下标
中间下标 就等于 左下标 加 右边下标 除以2

 如果小于,就把这个中间值的下标-1给到右边的下标
 中间下标 就等于 左下标 加 右边下标 除以2

以此类推直到找到为止...

当左边的下标大于右边的下标时,说明这个要找的值不存在. 

这里还有个最重要的,那就是折半查找,只能查找已经排好序的(不管升序还是降序)

假定定义一个数组int arr = {2, 7, 15, 21, 34, 45, 57, 61, 102, 120}

我们要查找的是 7是否在这个数组上

画个图是这样的:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
现在假设要查找的值,不在数组的情况下
假设我们要找的是3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图片链接:百度网盘

下面是java源代码

public class day05_13 {     //类名
    public static void main(String[] args){     //主函数
        int[] arr = {2, 7, 15, 21, 34, 45, 57, 61, 102, 120};
        int fis, in, tail;      //fise不能定义变量所以用 fis 首, in 中, tail 尾
        int key;                //用于输入用户要查找的数
        int num;                //接受数组的下标
        key = 7;                //假设用户要找的是7

        fis = 0;
        tail = arr.length-1;
        in = (fis+tail)/2;

        while(true)
        {
            if(arr[in] > key)   //中间数值大于要找的值
            {
                tail = in - 1; //把中间的下标-1给到右值
            }
            else if(arr[in] < key) //中间数值小于要找的值
            {
                fis = in + 1;   //把中间的下标+1给到右值
            }
            else        //这种是等于的情况
            {
                num = in;
                break;
            }

            if(fis>tail)    //当左边的大于右边的时候,说明没有数组内没有要找的值
            {
                num = -1;
                break;
            }

            in = (fis+tail)/2;
        }
        System.out.println("查找的数组下标为:"+num);
    }
}

代码执行之后的结果
在这里插入图片描述

下面这个是利用自定义函数写的源代码:

public class day05_14 {     //类名
    public static void main(String[] args)
    {
        int[] arr = {2, 7, 15, 21, 34, 45, 57, 61, 102, 120};
        int num;        //接受数组的下标
        num = find(arr, 7);
        System.out.println("查找的数组下标为:"+num);
    }

    //折半查找
    public static int find(int[] arr, int key){
        int fis, tail, in;      //fise不能定义变量所以用 fis 首, in 中, tail 尾

        fis = 0;
        tail = arr.length-1;
        in = (fis+tail)/2;

        while(arr[in] != key)       
        {
            if(arr[in] > key)       //中间数值大于要找的值
            {
                tail = in - 1;      //把中间的下标-1给到右值
            }
            else if(arr[in] < key)   //中间数值小于要找的值
            {
                fis = in + 1;       //把中间的下标+1给到右值
            }

            if(fis > tail)          //当左边的大于右边的时候,说明没有数组内没有要找的值
            {
                return -1;          //返回-1
            }
            in = (fis + tail)/2;

        }
        return in;
    }
}

.
.
.

更简洁的代码:

public class day05_15 {     //类名
    public static void main(String[] args){     //主函数
        int[] arr = {3, 4, 7, 9, 12, 18, 21, 41, 56, 71, 87, 90};
        int index = halfSearch(arr, 9);     //index 获取要找数值的数组的下标
        System.out.println("index="+index);     //输出找到的下标
    }

    //函数功能:折半查找
    public static int halfSearch(int[] arr, int key){
        int min = 0;
        int max = arr.length-1;

        while( min <= max)
        {
            int mid = (min+max)>>1; //向左移动一位,相当于除以2

            if(key> arr[mid])       //要找的值大于中间值的时候
            {
                min = mid-1;
            }
            else if (key < arr[mid])    //要找的值小于中间值的时候
            {
                max = mid +1;
            }
            else
            {
                return mid;         //相等的时候
            }



        }
        return -1;      //min>max说明要找的树没有在数组中,返回-1
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

折半查找 的相关文章

  • 数组的浅拷贝与深拷贝

    文章目录 1 数据类型 2 浅拷贝与深拷贝 3 实现深拷贝方法 3 1 JSON string 结合 JSON parse 3 2 递归 4 JS 中的拷贝方法 4 1 concat 4 2 slice 4 3 展开运算符 4 4 Obje
  • 折半查找

    什么是折半查找 折半查找其实通过字面上的意思就是大致就可以理解为每次查找的时候 选取中间下标的值进行查找 如果找不到 就判断这个要查找的数大于还是小于这个这个中间下标的值 如果大于 就把这个中间值的下标 1给到左边的下标 中间下标 就等于
  • 【华为OD机试真题 python】等和子数组最小和【2022 Q4

    前言 华为OD笔试真题 python 专栏含华为OD机试真题 华为面试题 牛客网华为专栏真题 如果您正在准备华为的面试 或者华为od的机会 有任何想了解的可以私信我进行交流 我会尽可能的给一些建议 和帮您解答 PS 文中答案仅供参考 不能照
  • Java创建数组的方法

    最近学Java 一点小心得 希望和大家分享一下 第一次写文章 写的不好希望大家谅解 当然我也会尽力写好这篇文章 Java创建数组的方法大致有三种 说明 这里以int为数据类型 以arr为数组名来演示 一 声明并赋值 int arr 1 2
  • string[]数组转为int[]数组方法

    string arrTemp 22 23 222 int intArray intArray Array ConvertAll
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • Java实现杨辉三角

    代码实现 package day01 public class yanghui public static void main String args 声明二维数组并初始化 int yanghui new int 10 给二维数组赋值 fo
  • #LeetCode刷题——350. 两个数组的交集 II

    难度 easy 1 题目介绍 2 思路分析 第一种方法 双指针法 先对俩个数组进行排序 使用俩个指针 i 和 j 不停遍历nums1和nums2 比较俩个元素的值 如果相等就增加到结果集中 如果 nums1 i lt nums2 j 将 i
  • 59. 螺旋打印情况

    i 代表一圈 j 从用来上下左右移动 主要是控制 i 与j 的参数关系就ok了 另一个是注意如何初始化 从左上角到右上角 while j
  • LeetCode-1827. 最少操作使数组递增【贪心,数组】

    LeetCode 1827 最少操作使数组递增 贪心 数组 题目描述 解题思路一 简单暴力 解题思路二 优化1 ans是操作数 mx是当前最大元素 mx无论如何会依次递增 解题思路三 优化2 遇到小的数就pre 1 否则变为num 题目描述
  • 1222. 可以攻击国王的皇后

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 从白国王出发 方法二 从黑皇后出发 写在最后 Tag 模拟 数组 题目来源 1222 可以攻击国王的皇后 题目解读 在一个 8 8 8 times 8 8 8 的棋盘上 有若干个
  • 448. Find All Numbers Disappeared in an Array

    查找缺失的数据 相似的题目查看如下链接的基本情况 448 查找缺失的数据 442 Find All Duplicates in an Array 先解决查找数组当中相同的元素 这道题目是442的 如何查找出数组当中出现多次的元素 这就是桶排
  • 【C++】细说C++中的数组之“静态”数组

    转自博主 https blog csdn net u013921430 article details 79514972 感谢分享 以备学习
  • 数组--二维数组

    JAVA的二维数组 二维数组 在二维数组中的每一个元素中都是一个一维数组 意思就是两个一维数组相嵌套而成的数组 二维数组的声明 有一下两种 int a int a 在声明时 一般推荐第一种情况 方便代码阅读 二维数组在创建时也要给定数组的长
  • python 数组操作中的 “:” “:: ” “, ” python 中的 [:-1] 和 [::-1] [-1:-2:-1] [

    使用python版本3 7 首先先了解下python3 7中的下标 python下标有两套 一套是正的 一套是负的 引入负坐标的意义应该是方便将数组中的数据从右往左访问 a python 中的python 的下标描述如下 组 p y t h
  • Web前端——Javascript复习(数组)

    1 数组 1 程序 数据结构 算法 一个好的数据结构 可极大提高程序的执行效率 相关的多个数据应集中存储 管理 分类和排序 2 数组概念 一组连续的变量组成的集合 批量管理多个数据 创建 2 1 var 变量名 2 2 var 变量名 值1
  • js删除数组里的某个元素

    删除数组中的某个元素 首先需要确定需要删除元素的索引值 var arr 1 5 6 12 453 324 function indexOf val for var i 0 i lt arr length i if arr i val ret
  • 数组的一些简单操作,列表改数组,数组合并,数组存取

    数组的简单操作 总用的一些操作 记录一下 要不总忘 1列表改数组 import numpy as np a 1 2 3 4 a np array a 输出a array 1 2 3 4 2数组合并 延竖轴拼接数组 aa np vstack
  • js 对数组对象进行排序

    let listData id 1 name 测试1 presenttime 1557883600000 id 2 name 测试2 presenttime 1580751813000 id 3 presenttime 1561448381
  • C++基础-一维和二维数组详解

    目录 定义 一维数组 二维数组 定义 数组是相同类型的对象序列 它们占据一块连续的内存区 一维数组

随机推荐

  • vue-element-admin第一篇:vue-element-admin初始项目

    1 事前准备 下载项目 https gitee com mirrors vue element admin git 执行代码 npm install npm run dev OK 准备工作完成 如果有报错 请移步到度娘那里去 2 先分析模块
  • [YOLO专题-10]:YOLO V5 - ultralytics/detect检测代码的命令行参数详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122266884 目录 第1章 准备
  • python时序数据处理2--提取年月信息、时间作差等

    同样首先先生成时序数据 1 生成时序数据 import pandas as pd import numpy as np from datetime import datetime timedelta test pd date range 2
  • 3.1 代码审核机制

    一次咨询活动 同一朋友交流基于复用的架构设计理念时 他说 你讲的那个很好 但离我们现状有点远 我现在每天要编码 要开会 要出差 要交流 要带人 要流程 招个能干的人可难了 而刚做顺手的就想跑 留一堆代码让我擦屁股 一段话不知道出了多少一线工
  • 三极管相关知识

    NPN型三极管 NPN型三极管 由三块半导体构成 其中两块N型和一块P型半导体组成 P型半导体在中间 两块N型半导体在两侧 三极管是电子电路中最重要的器件 它最主要的功能是电流 放大和开关作用 半导体三极管也称为晶体三极管 可以说它是电子电
  • Riverbed补齐最后一块拼图

    如果你知道APM Application Performance Management 应用性能管理 和NPM Network Performance Management 网络性能管理 应该知道它很重要 道理很简单 很多问题都是管理问题
  • C++:std::thread

    1 std thread的用法 头文件为 include
  • 【Computer Science】标准输入输出重定向

    本文介绍终端里的输入输出重定向 Windows 下的 cmd 和 Linux 下的 shell 相同 Command 功能 command gt filename 把标准输出重定向到一个文件中 command gt gt filename
  • 软件测试实习面试都问啥?

    软件测试实习面试都问啥 面试问的问题 Day1 April 8th Day2 April 9th Day3 April 10th 面试前的准备 color red heartsuit 实习面试结束 happy 这周我总共面试了三个软件测试的
  • Linux--vim使用

    普通文件编辑 vim 文件名 普通文件 命令行模式 ESC 插入模式 a i o O进入插入模式 末行模式 进入末行模式 q退出 q 强制退出 w保存 wq保存退出 w newfile另存 vim使用进阶 命令行模式下的命令 1 对于光标的
  • 从0到1构建新闻长文本分类系统

    新闻分类系统概述 新闻分类系统 顾名思义 就是对于一片新闻或者是一片文章 进行自动的分类 例如政治 财经 娱乐等等 从技术角度讲 其实属于自然语言处理中比较经典的文本分类问题 当然在一个工业级别的分类系统当中 会遇到各种各样的问题 例如语料
  • 【vulntarget】系列:vulntarget-g 练习WP

    本文仅为学习 vulntarget 在本地环境测试验证 无其它目的 请勿进行未经授权的测试 一 靶场信息 下载地址 百度云链接 链接 https pan baidu com s 1R 9udIuoPavsTI18 lPP3Q pwd ics
  • endl和"\n"的区别

    在C 中 打印字符串时 cout不会自动移到下一行 而想要换行 有两种方式 一种是控制符endl 一种是换行符 n 下面来介绍下两种方式 endl是一个C 符号 表示重起一行 在输出流中插入endl将导致屏幕光标移到下一行开头 C 中还提供
  • 使用带Arduino IDE & WIZ820io的ATmega1284P

    使用带Arduino IDE WIZ820io的ATmega1284P 2013 07 04 Filed under IO模块 and tagged with arduino Arduino IDE atmega1284p RAM问题 W5
  • 解决git push 错误error: src refspec master does not match any. error: failed to push some refs to

    解决git push 错误error src refspec master does not match any error failed to push some refs to 在和远程仓库关联后 我们通过 push 命令将本地仓库的文
  • 装机:MSDT & HEDT 的区别

    MSDT Main Stream Desktop 主流桌面平台 HEDT High End Desktop 高端桌面平台 HEDT平台在很多方面的性能都要比MSDT平台强很多 相对于MSDT平台 HEDT平台通常拥有更多的核心数量 更多的内
  • C#查询ACCESS数据库字段和时间字段

    查询表的所有字段 string Format SELECT FROM 0 TableName 查询表中的一个字段 在ACCESS中将字段用CStr 转换成字符串来判断 string Format SELECT FROM 0 WHERE CS
  • 多协议服务器,多协议远程连接服务器

    多协议远程连接服务器 内容精选 换一换 远程连接Linux云服务器报错 Access denied帐号或密码输入错误 SSH服务端配置了禁止root用户登录的策略 帐号或密码输入错误 检查输入的用户名或密码 Linux云服务器默认用户名ro
  • unity——小球酷跑游戏制作

    课堂课程记录 小球滚动 所有变量与物体名的命名原则都是见名知意 一 创建一个unity项目 二 Create所需3Dobject 1 Player 2 walls 三 添加属性 1 添加在Player上 a 添加Rigidbody组件 b
  • 折半查找

    什么是折半查找 折半查找其实通过字面上的意思就是大致就可以理解为每次查找的时候 选取中间下标的值进行查找 如果找不到 就判断这个要查找的数大于还是小于这个这个中间下标的值 如果大于 就把这个中间值的下标 1给到左边的下标 中间下标 就等于