二分搜索算法

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

思路分析

思路分析

  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;
  }
}

最新文章

  1. 实现UniqueAttribute唯一性约束,sqlunique约束[转]
  2. Boo who
  3. Android IOS WebRTC 音视频开发总结(七)-- 基于浏览器的开发
  4. tmux与vim主题不一致
  5. Codeforces Round #198 (Div. 2) C. Tourist Problem (数学+dp)
  6. Java Reflection(getXXX和getDeclaredXXX)
  7. 还能不能愉快地起一个web服务啦?——1st Step!白话http和代码交互的那点儿事儿~
  8. form,ajax注册,logging日志使用
  9. leetcode34
  10. 洛谷 P1378 油滴扩展 改错
  11. 接口app 接口中上传 图片
  12. np.tile语法
  13. Oracle sys 用户无密码文件无法登录
  14. python的re正则表达式模块
  15. 【Android】Retrofit网络请求Service,@Path、@Query、@QueryMap...
  16. 初学者浅谈我对领域驱动设计(DDD)的理解
  17. Comparable&lt;T&gt; 和 Comparator&lt;T&gt;
  18. 深入理解Java虚拟机---类加载机制(简略版)
  19. IntelliJ Idea编译报错:javacTask: 源发行版 1.8 需要目标发行版 1.8
  20. hdu 5207 Greatest Greatest Common Divisor 数学

热门文章

  1. ATT&amp;CK模型
  2. Java 中常见的细粒度锁实现
  3. Android呼吸灯添加
  4. 如何用思维导图软件MindManager制作项目管理图表
  5. Vim注释行的方法
  6. selenium如何处理H5视频
  7. 解决-Chrome插件安装时程序包无效:&quot;CRX_HEADER_INVALID&quot;
  8. IDEA创建web工程,不用Archetype(超简单)
  9. MySQL制作具有千万条测试数据的测试库
  10. HBase中Memstore存在的意义以及多列族引起的问题和设计