二分搜索算法

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

思路分析

思路分析

  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. 建议收藏!2020阿里面试题(JVM+Spring Cloud+微服务)上

    前言 对于大厂面试,我想要强调的一点就是心态真的很重要,是决定你在面试过程中发挥的关键,若不能正常发挥,很可能就因为一个小失误与offer失之交臂,所以一定要重视起来.另外提醒一点,充分复习,是消除你 ...

  2. PDF文档工具:pdfFactory快照功能详解

    pdfFactory的快照功能,是通过一种类似截图的方式,将文档中的内容,如标题.图片.段落.文字等进行剪切的功能.剪切后的内容会转化为文本框的形式,我们可以对其进行加边框.旋转等编辑处理,但不能对其 ...

  3. FL studio系列教程(十六):FL Studio查看菜单讲解

    FL Studio中每个窗口的显示.隐藏和布局命令都在查看菜单中.其中它被分为窗口.布局和浏览器3个部分,各项名称都有其单独的作用.窗口部分主要是软件的显示的一些菜单这里就不详细讲解了,接下来我们重点 ...

  4. JS获取当前日期及 js获取当前时间和一星期前的时间

    var myDate = new Date();     new Date() 代表当前 年 月 日 时 分 秒: myDate.getYear();        //获取当前年份(2位),getY ...

  5. thinkphp3.2 添加自定义类似__ROOT__的变量

    1 thinkphp3.2 添加自定义类似__ROOT__的变量 2 3 在config.php文件中 4 return array( 5 '' => '', 6 'TMPL_PARSE_STR ...

  6. Spring 对Apache Kafka的支持与集成

    1. 引言 Apache Kafka 是一个分布式的.容错的流处理系统.在本文中,我们将介绍Spring对Apache Kafka的支持,以及原生Kafka Java客户端Api 所提供的抽象级别. ...

  7. k8s 自动伸缩 pod(HPA)

    上一篇简单说了一下使用 kubeadm 安装 k8s.今天说一下 k8s 的一个神奇的功能:HPA (Horizontal Pod Autoscaler). HPA 依赖 metrics-server ...

  8. Matlab 数值计算

    本博客记录一些简单的计算 det(A):矩阵求行列式 A=[1,2;3,4]; det(A) ans=-2; inv(A):矩阵求逆 A=[1,2;3,4]; B=inv(A) B=[-2,1;1,5 ...

  9. LaTeX中的数学公式之矩阵

    矩阵的代码及注释: 显示效果:

  10. Java安全之JNI绕过RASP

    Java安全之JNI绕过RASP 0x00 前言 前面一直想看该JNI的相关内容,但是发现JNI的资料还是偏少.后面发现JNI在安全中应用非常的微妙,有意思. 0x01 JNI概述 JNI的全称叫做( ...