二分搜索算法

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

思路分析

思路分析

  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. CSS3之flex布局

    若要使用flex布局,需在父元素上声明" display : flex ",这样它所有的直系子元素就成为flex元素 1.居中 1)垂直居中:align-items : cente ...

  2. python-网络安全编程第五天(爬虫模块BeautifulSoup)

    前言 昨晚学的有点晚 睡得很晚了,今天早上10点多起来吃完饭看了会电视剧就瞌睡了一直睡到12.50多起来洗漱给我弟去开家长会 开到快4点多才回家.耽搁了不少学习时间,现在就把今天所学的内容总结下吧. ...

  3. 【C++】sort函数使用方法

    一.sort函数 1.sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以实现对数据的排序,但是sort函数是如何实现的,我们不用考 ...

  4. java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析的属实到位

    前言 JVM 内存模型一共包括三个部分: 堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区). 栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 ) 保证程序 ...

  5. 深度分析:Java并发编程之线程池技术,看完面试这个再也不慌了!

    线程池的好处 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池,相对于单线程串行处理(Serial Processing ...

  6. 考研党其实可以用思维导图MindManager做考研复习计划

    近年由于就业压力,个人学历提升等各种原因,考研的人数越来越多了,相对难度也越来越大了,尽管今年研究生招生规模同比去年增加18.9万,但也无法掩盖考研的竞争逐年激烈. 身为考研大军中的预备选手之一,小编 ...

  7. macbook上安装虚拟机软件如何操作?

    很多用户都不太熟悉苹果系统,用惯了Windows之后再过渡到MacOS难免会有些不习惯.为了使我们又可以用回那些熟悉的Windows应用,比较常见的办法就是安装macbook虚拟机.下面小编就教大家一 ...

  8. Boom 3D的保真度是什么,如何应用

    Boom 3D是一款非常优秀的3D音频软件,拥有3D音效.环境模式.空间模式.夜间模式.保真度等多种音效模式,可以为用户提供多种音效体验感. 第一.什么是保真度 或许第一次接触音频软件的朋友就会问到什 ...

  9. python3错误AttributeError: 'TestSequenceFunctions' object has no attribute 'seq'

    对比了两段代码发现,原来是setUp要用用大写才能被正确引用. 修改后,代码运行成功.

  10. C语言讲义——内联函数

    如果一些函数被频繁调用,不断地有函数入栈(Stack),会造成栈空间的大量消耗. 对应这种问题,可以使用内联函数(inline). 编译器会将内联函数的代码整段插入到调用的位置. #include & ...