• 查找算法之二分查找


    二分查找也叫折半查找

    思路分析:

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

    }

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

    结果截图:

  • 相关阅读:
    避免因为Arcgis Server服务设置不当导致Oracle Process溢出的方法
    ArcSOC进程数不断增长导致oracle processes溢出原因分析
    PostgreSQL中的Toast Pointer
    SQLite中字段顺序和PAGE_SIZE对性能的影响
    PG数据库CPU和内存满负荷运转优化案
    ArcGIS Server浏览地图服务无响应原因分析说明
    PythonWeb全栈开发-虚拟环境搭建
    C 语言学习——错误处理
    C 语言学习——Valgrind 内存问题简述
    HTML学习--拖放API实现拖放排序
  • 原文地址:https://www.cnblogs.com/juddy/p/13778788.html
Copyright © 2020-2023  润新知