首页 > 其他分享 >顺序查找、二分查找

顺序查找、二分查找

时间:2024-10-14 23:19:10浏览次数:3  
标签:二分 arr 顺序 int mid 查找 目标值 79

一、基本查找(顺序查找):从前往后,挨个查找

二、二分查找(折半查找)

1、前提条件:数组中的数据必须是有序的。

2、核心思想:每次排除一半的数据,查询数据的性能明显提高极多。

举例:从一组数据中,找出79。

第一步:从小到大排序。

第二步:

此时目标值79小于81,因此要将right移到mid左侧。

第三步:

此时目标值79大于23,因此要将left移到mid右侧。

第四步:

此时目标值79等于79,找到。

3、特殊情况:

此时数组中没有我们要找的数字150,目标值150大于147。

因此需要将left移到mid右侧。

此时left在right右侧,已经发生了错位,找不到目标值150,因此就结束二分查找。

所以得出结论:二分查找正常的折半条件应该是开始位置left <= 结束位置right。

4、代码演示

public class Test3 {
    public static void main(String[] args) {
        //1、准备好一个数组
        int[] arr = {81, 7, 79, 23, 103, 127, 147, 131};

        System.out.println(binarySearch(arr, 81));
    }

    public static int binarySearch(int[] arr, int data){
        //1、先对数组进行排序(从小到大)
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

        //2、定义两个变量,开始二分查找
        int left = 0;
        int right = arr.length-1;
        int mid;
        while(left<=right){
            mid = (left + right)/2;
            if(arr[mid]==data){
                return data;
            }
            if(arr[mid]>data){
                right = mid-1;
                continue;
            }
            if(arr[mid]<data){
                left = mid+1;
                continue;
            }
        }
        //如果没找到,就返回-1
        return -1;
    }
}

当然,如果我们不想要找到的目标值,也可以将mid返回。

其实,Java的Arrays工具类已经写好了二分查找,即Arrays.binarySearch(要查找的数组,目标值),返回值为目标值的下标。

标签:二分,arr,顺序,int,mid,查找,目标值,79
From: https://blog.csdn.net/qq_63981644/article/details/142929694

相关文章

  • Excel:vlookup函数实现查找
    1.要查找宋江的英语,把鼠标放在对应单元格然后开始编辑2.选中所选区域,点击F4锁定区域,不然下拉填充的时候会变VLOOKUP在查找时有严格要求,查找值必须在所选区域的第一列,因此如果你的查找值不在第一列,可能会导致不能正常选择或使用。3.要理解函数括号里面的值都是什么意思在选......
  • ArrayList和顺序表(下)
    1.Java本身提供的ArrayList    在ArrayList和顺序表(上)那一节里面,我们自己实现了ArrayList的底层大部分代码,在这个基础上,我们就可以开始来了解Java本身提供的ArrayList.    1.1ArrayList的三种构造方法        方法解释ArrayList()无参构造A......
  • 查找大量时序遥感文件缺失、不连贯的成像日期:Python代码
      本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计、列出未下载影像所对应的时相的方法。  批量下载大量遥感影像文件对于RS学生与从业人员可谓十分常见。在我们之前的文章中,就介......
  • [SDOI2017] 新生舞会——二分 最大费用最大流
    [SDOI2017]新生舞会题目描述学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴。有\(n\)个男生和\(n\)个女生参加舞会,一个男生和一个女生一起跳舞,互为舞伴。Cathy收集了这些同学之间的关系,比如两个人之前认识没,计算得出\(a_{i,j}\)。Cathy还需......
  • element 穿梭框el-transfer 实现上下移动选中的数据顺序
    代码实现<template><div><el-buttontype="primary"size="default"@click="upDown('up')">up</el-button><el-buttontype="primary"size="default"@click="upDo......
  • 手撸二叉树——二叉查找树
    二叉树是数据结构中非常重要的一种数据结构,它是树的一种,但是每个节点的子节点不能多余两个,可以是0,1,2个子节点,0个子节点代表没有子节点。常见的二叉树结构如下图所示:每个节点的子节点不多于2个,其中3,4,5没有子节点,2有一个子节点,0,1都有两个子节点。基础概念根节点:树的其实节点,没有......
  • JavaScript中的流程控制(顺序结构、分支结构、循环结构)
    流程控制1.概念在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的,很多时候要通过控制代码的执行顺序来实现我们完成的功能简单的理解:流程控制就是控制代码,按照一定的结构顺序来执行流程控制的分类:顺序结构分支结构循环结构2.顺序流程控......
  • 行人重识别——基于文本描述的行人检索与查找查询对象
    介绍人的重新识别,即搜索人的图像,在许多方面都有需求,如从安全摄像机中寻找嫌疑人或丢失的儿童。其中,基于文本的人的重新识别,即不搜索显示与输入图像相同的人的图像,而是从文本中搜索显示与之匹配的人的图像,已经引起了很多人的注意。在基于文本的人的再识别任务中,主要的方法......
  • C#二分查找算法
    前言二分查找算法是一种在有序数组中查找特定元素的搜索算法。实现原理二分查找的实现依赖于以下几个关键步骤:计算查找范围的中间索引。比较中间索引处的值与目标值。根据比较结果调整查找范围(左半部分或右半部分)。重复上述步骤直到找到目标值或查找范围为空。动图演示......
  • Leetcode 1192. 查找集群内的关键连接
    1.题目基本信息1.1.题目描述力扣数据中心有n台服务器,分别按从0到n-1的方式进行了编号。它们之间以服务器到服务器的形式相互连接组成了一个内部集群,连接是无向的。用connections表示集群网络,connections[i]=[a,b]表示服务器a和b之间形成连接。任何服务器都可......