zoukankan      html  css  js  c++  java
  • 查找算法之二分查找

    二分查找也叫折半查找

    思路分析:

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

    2.然后让查找的数findval与mid进行比较

       a.findval>mid;说明要查找的数在数组的右边,因此递归的向右进行查找

       b.findVal<mid:说明查找的数在数组的左边,因此递归的向左边进行查找

       c.findVal==mid:说明要查找的数就是,返回

    注意:递归结束的时间

    找到就结束递归

    递归完整个数组,仍然没有找到数据,也需要结束递归,即left>right

    代码:

    package com.gcy.searcch;

    import java.util.ArrayList;
    import java.util.List;

    import javax.lang.model.element.VariableElement;

    /**
    * 二分查找
    * 要求:数组必须是有序的
    * @author Administrator
    *
    */
    public class BinarySearch {

    public static void main(String[] args) {
    int[] arr={1,8,10,89,1000,1000,1000,1000,1234};
    List<Integer> list=binarySearch2(arr, 0, arr.length-1, 1000);
    System.out.println("list="+list);

    }
    /**
    * 要找的数只要找到就立刻返回,不考虑在数组中该数字是否有重复,因此这种方法是有问题的,只能判断该数组中是否有要查找的数据
    * @param arr数组
    * @param left数组最左边 数据
    * @param right数组最右边的数据
    * @param val要查找的数据
    * @return返回查找到的数据在数组中的下标值
    */
    public static int binarySearch(int[] arr,Integer left,Integer right,int val) {
    //当left>right时,说明递归整个数组,但是没有找到
    if(left>right) {
    return -1;
    }
    int mid=(left+right)/2;
    int midVal=arr[mid];
    if(val>midVal) {//向右递归
    return binarySearch(arr, mid+1,right, midVal);
    }else if(val<mid) {//向左边递归
    return binarySearch(arr, left, mid-1, midVal);
    }else {
    return mid;
    }
    }
    /**
    * 数组中可能有多个相同的值,在查找故工程中全部查找出来
    * 思路分析:
    * 1.在找到mid索引值,不要立刻返回
    * 2.向mid索引值的左边扫描,将所有满足的数值的下标,加入到ArrayList中
    * 3.向mid索引值的右边扫描,将所有满足的数值的下标,加入到ArrayList中
    * 4.返回ArrayList
    * @param arr
    * @param left
    * @param right
    * @param val
    * @return
    */
    public static ArrayList binarySearch2(int[] arr,Integer left,Integer right,int val) {
    //当left>right时,说明递归整个数组,但是没有找到
    if(left>right) {
    return new ArrayList<>();
    }
    int mid=(left+right)/2;
    int midVal=arr[mid];
    if(val>midVal) {//向右递归
    return binarySearch2(arr, mid+1,right, midVal);
    }else if(val<mid) {//向左边递归
    return binarySearch2(arr, left, mid-1, midVal);
    }else {
    ArrayList<Integer> resIndexList=new ArrayList<>();
    int temp=mid-1;
    while (true) {
    if(temp<0 || arr[temp]!=val) {//退出
    break;
    }
    //否则,就把temp放入到集合中
    resIndexList.add(temp);
    temp-=1;//temp左移
    }
    resIndexList.add(mid);

    temp=mid+1;
    while (true) {
    if(temp>arr.length-1|| arr[temp]!=val) {//退出
    break;
    }
    //否则,就把temp放入到集合中
    resIndexList.add(temp);
    temp+=1;//temp右移
    }
    return resIndexList;
    }
    }

    }

    在上面代码中,出现两个方法,上面都有解释,简单来说就是真实在写的时候,应该写出的是第二种,而不是第一种

    结果截图:

  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/juddy/p/13778788.html
Copyright © 2011-2022 走看看