二分搜索算法

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

思路分析

思路分析

  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. webug第四关:告诉你了flang是5位数

    第四关:告诉你了flang是5位数 开始看到有点懵 于是不要脸的看源码 burp跑弱口令

  2. Camtasia制作视频分割与视频拼接

    视频的分割与拼接是在制作和编辑视频中经常用到的方法,运用Camtasia视频编辑器能够让视频制作更加的简单和便捷.Camtasia是一款录频软件和视频编辑器,可以进行屏幕录制.拖放视频等操作.小编采用 ...

  3. 文件误删了怎么办,EasyRecovery来帮忙

    哈喽大家好!又到了年底冲业绩的时候了,每逢这个时候,收拾自己的电脑就和收拾放假一样,令人头秃,不是这个文件丢了,就是那个数据没了,不管您是为论文头秃发愁的学生,还是朝九晚五的上班族,又或者是日进斗金的 ...

  4. Idea中如何导入jar包

    1.首先在idea左上角找到" File ",然后找到 "Project structure" 2.接着选择 " java ",选择后接着会 ...

  5. 记录一下超大list引起oom

    1.2g的堆内存 比较大的对象20w个,oom

  6. vs2019 Com组件初探-通过IDispatch接口调用Com

    vs2019 Com组件初探-简单的COM编写以及实现跨语言调用 上一篇实现了如何编写基于IDipatch接口的COM以及vbs如何调用编写的COM 本次主要是实现VBS的CreateObject函数 ...

  7. no Qt platform plugin could be initialized问题的解决办法

    ☞ ░ 前往老猿Python博文目录 ░ 今天因要使用到一个以前PyQT写得工具,但运行时报错: This application failed to start because no Qt plat ...

  8. 第二十八章、containers容器类部件QStackedWidget堆叠窗口部件详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 StackedWidget堆叠窗口部件为一系列窗口部件的堆叠,对应类为QStackedWi ...

  9. 第11.14节 正则表达式转义符和Python转义符相同引发问题的解决办法

    正则表达式使用反斜杠('\')来把特殊字符转义成普通字符(为了方便称为"正则表达式转义"),而反斜杠在普通的 Python 字符串里也是转义符(称为"字符串转义" ...

  10. PyQt(Python+Qt)学习随笔:QListWidget插入多项的insertItems方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 除了insertItem方法能插入项外,QListWidget支持一次插入多个项,对应的方法就是in ...