二分搜索算法

有序数列才可用二分查找算法

思路分析

思路分析

  1. 首先确定该数组的中间下标mid = (left + right)/ 2

  2. 然后让需要查找的数findVal和arr【mid】比较

    • findVal > arr[mid],向右查询

    • findVal < arr[mid],向右查询

    • findVal == arr[mid],找到,返回

  3. 结束递归的条件

    • 找到就结束

    • 递归完整个数组,未找到,结束递归,left > right

二分查找递归算法

基本写法

public static int binarySearch(int[] arr,int left,int right,int findVal){
   if (left > right){
       return -1;
  }
   //确定中间数组的下标
   int mid = (left + right)/2;
   int midVal = arr[mid];

   //与中间数组比较
   if (findVal > midVal){//向右查找
       return binarySearch(arr,mid+1,right,findVal);
  }else if (findVal < midVal){
       return binarySearch(arr,left,mid-1,findVal);
  }else {
       return mid;
  }
}

新需求

当一个数组中有多个相同的数值是 ,将所有数值都查到

代码实现

package com.why.search;

import com.sun.jdi.PathSearchingVirtualMachine;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
import java.util.logging.Level;

/**
* @Description TODO 当一个数组中有多个相同的数值是 ,将所有数值都查到,使用二分查找
* @Author why
* @Date 2020/11/1 16:35
* Version 1.0
**/
public class NewBinarySearch {
   public static void main(String[] args) {
       int[] arr = {1,8,8,10,10,10,10,11};
       List res = newBinarySearch(arr, 0, arr.length - 1, 8);
       if (!res.isEmpty()){
           System.out.println(res);
      }else {
           System.out.println("未找到");
      }
  }

   /**
    * 二分查找查找多条数据
    *
    * 思路:
    * 找到mid值时,不要马上返回
    * 向mid 索引值的左边扫描将所有满足查找值的元素下标加入到集合
    * 向右扫描将所有满足查找值的元素下标加入到集合
    * @param arr
    * @param left
    * @param right
    * @param findVal
    * @return
    */
   public static List<Integer> newBinarySearch(int[] arr, int left, int right, int findVal){

       if (left > right){
           return new ArrayList<Integer>();
      }
       int  mid = (left + right) / 2;
       int midVal = arr[mid];


       if (findVal > midVal){
           return newBinarySearch(arr,mid + 1,right,findVal);
      }else if (findVal < midVal){
           return newBinarySearch(arr,left,mid - 1,findVal);
      }else {
           List<Integer> resIndexList = new ArrayList<>();
           //向左边扫描
           int temp = mid - 1;
           while (true){
               if (temp < 0 || arr[temp] != findVal){
                   break;
              }
               resIndexList.add(temp);
               temp -= 1;
          }
           //中间值
           resIndexList.add(mid);
           //向右扫描
           temp = mid + 1;
           while (true){
               if (temp > arr.length || arr[temp] != findVal){
                   break;
              }
               resIndexList.add(temp);
               temp += 1;
          }
           return resIndexList;
      }
  }
}

二分查找非递归算法

需求

数组{1,3,8,10,11,67,100},编程实现二分查找,以非递归形式完成

代码实现

package whyAlgorithm.binaryseaech;

import jdk.swing.interop.LightweightFrameWrapper;

/**
* @Description TODO 二分查找非递归形式
* @Author why
* @Date 2020/12/9 19:53
* Version 1.0
**/
public class BinarySearchNoRecursion {
   public static void main(String[] args) {
       int[] arr = {1,3,8,10,11,67,100};
       int target = binarySearch(arr,10);
       System.out.println("下标:" + target);
       System.out.println(arr[target]);
  }

   /**
    * 二分查找非递归算法
    * @param arr 数组,升序排列
    * @param target 需要查找的算法
    * @return 返回数组下标
    */
   public static int binarySearch(int[] arr,int target){
       int left = 0;
       int right = arr.length - 1;
       while (left <= right){//查找
           int mid = (left + right)/2;
           if (arr[mid] == target){//找到中间数
               return mid;
          }else if (arr[mid] > target){//大于向左查找
               right = mid - 1;
          }else {//小于向右查找
               left = mid + 1;
          }
      }
       return -1;
  }
}

算法(Java实现)—— 二分搜索算法的更多相关文章

  1. 二分查找算法java实现

    今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索 ...

  2. 1月21日 Reference Data Type 数据类型,算法基础说明,二分搜索算法。(课程内容)

    Reference Datat Types 引用参考数据类型 -> 组合数据类型 Array, Hash和程序员自定义的复合资料类型 组合数据的修改: 组合数据类型的变量,不是直接存值,而是存一 ...

  3. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  4. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  5. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  6. 堆排序算法 java 实现

    堆排序算法 java 实现 白话经典算法系列之七 堆与堆排序 Java排序算法(三):堆排序 算法概念 堆排序(HeapSort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特 ...

  7. Atitit 电子商务订单号码算法(java c# php js 微信

    Atitit 电子商务订单号码算法(java c# php js  微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...

  8. 无向图的最短路径算法JAVA实现

    一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...

  9. 无向图的最短路径算法JAVA实现(转)

    一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图. ...

随机推荐

  1. 记一次容器内执行ansible命令卡住

    1.由来 最近在使用kylin_v10系统,发现当在此系统下运行的容器内执行#ansible localhost -m setup 命令会卡住不动,于是和同事一起经过如下排查最终找到解决问题的办法. ...

  2. java开发两年,连这些多线程知识都还没掌握,你凭什么涨薪!

    并发与并行 并发:两个或者多个事件在同一时间段发生(交替执行) 并行:两个或者多个事件在同一时刻发生(cpu多核.同时执行) 线程与进程 进程:是一个内存中运行的应用程序,有自己独立的内存空间,一个应 ...

  3. FL Studio中echo的延迟作用

    今天来一起研究FL Studio的Echo Delay的作用,Echo Delay可以从MIDI输入创建回声,并允许我们通过音量,声像,切除和共振,音高和时间来操纵延迟. 图1:Echo Dealy ...

  4. 手把手教你用思维导图软件iMindMap制作计划表

    在日常生活中小编也经常使用思维导图软件iMindMap来创建思维导图以规划工作及学习的安排.尤其是时间安排类型的思维导图,能极大程度的节约我们的时间,接下来就由小编以自己假期的社会实践向大家分享一下怎 ...

  5. Python Api接口自动化测试框架 代码写用例

    公司新来两个妹子一直吐槽这个接口测试用例用excel维护起来十分费脑费事,而且比较low(内心十分赞同但是不能推翻自己),妹子说excel本来就很麻烦的工具,于是偷偷的进行了二次改版. 变更内容如下: ...

  6. 《图解TCP/IP》第四章

    <图解TCP/IP>第四章 4.1 IP 即网际协议 4.1.1 IP(IPv4.IPv6)相当于OSI参考模型中的第3层-网络层 4.1.2 数据链路层和网络层的关系: 数据链路层的主要 ...

  7. CCF-CSP认证 C++题解目录

    持续更新中,记录刷题过程并分享一下小小的心得总结. 试题编号 试题名称 标签 202006-1 线性分类器 | 题解 线性规划 202006-2 稀疏向量| 题解 归并排序思想 202006-3 化学 ...

  8. C语言讲义——函数

    为实现特定目的而编写的一段可被调用的代码 简单地讲:函数就是一组语句,取了个名字 别名:子例程(routine)/方法(Method,一般面向对象的语言使用这个叫法) 函数的组成部分 以主函数为例: ...

  9. 用FL Studio基础版制作一首完整的电音

    电音制作,自然少不了适合做电音的软件,市面上可以进行电音制作的软件不少,可是如果在这些软件中只能选择一款的话,想必多数人会把票投给FL Studio,毕竟高效率是永远不变的真理,今天就让我们来看看如何 ...

  10. dubbo与zk

    一.总体流程: 1.服务提供者启动时,会向注册中心写入自己的元数据信息,同时会订阅配置元数据信息: 2.消费者启动时,也会向注册中心写入自己的元数据信息,并订阅服务提供者.路由和配置元数据信息: 3. ...