Java 顺序查找 二分查找

查找

Java 中我们常用的查找有两种:

  • 顺序查找
  • 即:有一个数组/数列 {"a", "b", "c", "d"} 我们从键盘中输入任意一个 与数组类型相同的值,然后循环遍历这个数组,判断数组中是否有这个值,如果有就返回其所在的 索引值
  • 二分查找
  • 二分查找有个前提条件,就是这个数组必须是有序的。
  • 二分查找即:有一个数组 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},在查找的时候将数组从中间分成两分,要查找的值如果比 中间值大则往右边的数据查找,否则反之。就这样一直对半分,直到找到这个值。

顺序查找的代码实现

// 顺序查找

// 被查找的数组
String strArray[] = {"a", "b", "小明", "Java"};
// 要查找的值
String findName = "小明";
// 存放查找结果 默认为 -1
int result = -1;
// 循环遍历数组
for (int index = 0; index < strArray.length; index++) {
    if (strArray[index].equals(findName)) {
        result = index;
        break;
    }
}
// 如果 result 为 -1 说明没找到
switch (result) {
    case -1:
        System.out.println(findName + " 在该数组中不存在");
        break;
    default:
        System.out.println(findName + " 在该数组索引为 " + result);
}

二分查找代码实现

思路分析:

  1. 找到中间数值, 然后用要查找的值 与中间值进行比较,
  2. 如果中间值 比 要查找的值比小 (数组是从小到大排列) 则 以本次数组的中间索引 +1 为下一次查找的第一个索引值
  3. 如果中间值 比 要查找的值比大 (数组是从小到大排列) 则 以本次数组的中间索引 -1 为下一次查找的最后一个索引值
  4. 重复以上操作, 直到 中间值等于寻找的值或中间值等于起始值结束

以下是该思路的图形表示:

Java 顺序查找 二分查找

有了思路接下来按照思路实现代码:

/*
  再次确定思路:
  1. 需要 变量记录 最大最小索引值

  2. 无限循环把数组对半分, 每次循环需要修改对应的 最小或最大值, 再计算中间值
  直到 中间值对应的元素与要查找的元素一致 或
  中间值等于最小索引值且中间值对应的元素不等于要查找值,时退出循环

  3. 定义变量接收查找结果,
  如果找到结果会将索引值赋给这个变量
  默认为 -1 如果循环结束后 依旧为 -1
  说明 要查找的值在数组中不存在
*/
// 被查找数组
int twoPointsArray[] = {4, 5, 8, 14, 20, 40, 46, 54, 80};

// 定义最小索引值
int startIndex = 0;
// 定义最大索引值
int endIndex = twoPointsArray.length - 1;
// 定义中间值, 要获取中间值,必需先获取最小和最大索引值
int midIndex = (startIndex + endIndex) / 2;
// 要查找的元素
int findItem = 1;
// 定义变量接收查找结果
int findResult = -1;

// 因为无法确定循环次数 所以使用 while 循环
while (true) {
    // 如果数组的中间值对应索引的元素与要查找的元素一致,
    // 将该索引值返回给 findResult 变量 并终止循环
    if (twoPointsArray[midIndex] == findItem) {
        findResult = midIndex;
        break;
    }
    // 如果中间值和起始值中止一致,且中间值在数组中对应的元素与要查找的值不一致
    // 代表该数组中没有这个值,直接退出循环
    else if (startIndex == endIndex) {
        break;
    }
    // 如果数组的中间值对应索引的元素比要查找的元素大,
    // 将最大索引值设为 中间值 -1 , 并重新计算中间值
    else if (twoPointsArray[midIndex] > findItem) {
        endIndex = midIndex - 1;
        midIndex = (startIndex + endIndex) / 2;

    }
    // 上面三种情况处理完 只剩下最后一种就是 中间值对应的元素 小于 要查找的值
    // 将最小索引值设为 中间值 +1, 并重新计算中间值
    else {
        startIndex = midIndex + 1;
        midIndex = (startIndex + endIndex) / 2;

    }
}

switch (findResult) {
    case -1:
        System.out.println(findItem + " 在该数组中不存在");
        break;
    default:
        System.out.println(findItem + " 在数组中的索引为: " + findResult);
}

为什么中间值对应的元素 大于或小于 要查找的值时要将 最小或最大索引 -1 或 +1:

因为在我们比对中间值对应的元素是否 大于或小于 要查找的值时,就相当于判定了中间值对应的元素不等于要查找的值,既然不等于 要查找的值,那么后续的查找也可以将这个值排除在外了。

Original: https://www.cnblogs.com/jwyqn/p/16187948.html
Author: 假文艺青年。
Title: Java 顺序查找 二分查找

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570060/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 责任链模式总结

    定义 来自 GoF 的《设计模式》权威定义如下: Avoid coupling the sender of a request to its receiver by giving …

    Java 2023年6月14日
    071
  • 5.Dubbo3新特性

    1.注册模型的改变 2.x版本时一个接口就是一个服务 3.x引入了全新的基于应用粒度的服务发现机制 zk的可视化工具,可以看出,dubbo3.x兼容了之前2.x以接口名称为key,…

    Java 2023年6月5日
    0113
  • Java程序员必备的工具和框架

    最近几年,Java 的技术栈发展的非常快,成百上千的技术工具正不断地涌出来,这也造成了一个问题: 我们作为开发者,到底应该选哪些工具搭建出最合适的技术栈呢? 今天我就推荐一波我常用…

    Java 2023年6月7日
    064
  • 设计模式 11 外观模式

    外观模式(Facade Pattern)属于 结构型模式 在生活中,经常遇到这样的情况:办理一个业务,需要找很多部门签字盖章,这些部门往往距离较远,无奈只得四处奔波。这时候相信所有…

    Java 2023年6月6日
    089
  • 索引二倒排索引和正排索引

    一 以有限对无限 这个世界很多东西是无限的,比如可以创造无限的小说,可以创造无限个程序。但是小说虽然无限,小说中的字数却是有限,拿汉字来说,我查到的最高记录也就9万多个,常用的就五…

    Java 2023年5月30日
    093
  • 12、线程优先级

    12、线程优先级 priority java;gutter:true; package com.testthread1;</p> <p>/*<em&g…

    Java 2023年6月8日
    058
  • C语言求100以内的和的4种方式

    C语言的一个很经典的例子,帮助熟练运行几个循环的写法 方法一(do—while语句) #include main () { int i,sum=0; do { sum=…

    Java 2023年6月9日
    092
  • Eclipse WindowBuilder(SWT)插件安装及初次使用记录(萌新)

    Eclipse WindowBuilder(SWT)插件安装及初次使用(萌新) 一、插件安装 (有VPN 的挂VPN ,服务器在外网更新下载比较慢) 1.首先更新到最新版本 点击 …

    Java 2023年6月5日
    094
  • 三,手写SpringMVC框架,第三次改进

    1 . 解决跳转问题:添加一个 login 方法,跳转返回一个字符串。 中央控制器DispacherServlet 调用EmpController ,所以字符串返回给中央控制器。如…

    Java 2023年6月16日
    073
  • abp MicroserviceDemo swagger添加 OAuth

    abp官方示例中的 abp-samples,swagger并没有提供 OAuth,这个在我们平时的开发过程中并不太友好,这里记录下在添加 swagger OAuth遇到的一些问题,…

    Java 2023年6月8日
    0124
  • Makfile总结

    Makefile基础以及小技巧 当我们在命令行当中输入 make的时候他的执行流程如下: make命令首先会在当前目录下面寻找makefile或者Makefile文件。 寻找到ma…

    Java 2023年6月8日
    0147
  • RabbitMQ:大白话讲解RabbitMQ架构原理

    MQ是什么? MQ全称Message Queue,中文名称消息队列。顾名思义,它就是一个队列,简单来说就是一个应用程序A将数据丢到一个队列中,由另一个应用程序B从队列中拿到这个数据…

    Java 2023年5月30日
    074
  • 2.servlet实现用户登录功能

    在该案例中,通过servlet实现了用户登录的功能。主要涉及前端页面请求数据,servlet程序处理请求,业务逻辑层调用相关的dao层,在数据库提取数据并return给servic…

    Java 2023年6月8日
    086
  • 数据库连接查询总结

    建表SQL create table account ( account_id bigint PRIMARY KEY AUTO_INCREMENT, name varchar(64…

    Java 2023年6月6日
    079
  • Java基础之 逻辑运算符、位运算符

    逻辑运算符 1 public class Demo05 { 2 public static void main(String[] args) { 3 // 与(and) 或(or)…

    Java 2023年6月8日
    095
  • RabbitMQ镜像集群配置

    上面已经完成RabbitMQ默认集群模式, 但并不保证队列的高可用性,队列内容不会复制。如果队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应…

    Java 2023年5月30日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球