8.3 二分查找

二分查找:要求在有序数组中

在这里插入图片描述
在这里插入图片描述

package search;

//数组是有序的
public class BinarySearch {
    
    

    public static void main(String args[]){
    
    
        int arr[] = {
    
    1,8,10,89,1000,1234};

        int resIndex = binarySearch(arr,0,arr.length-1,12345);
        System.out.println("resIndex=" + resIndex);
    }

    //二分查找  如果找到返回下标,否则-1
    public static int binarySearch(int[] arr,int left,int right,int findVal){
    
    

        //当left》right结束,没有找到
        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 search;

import java.util.ArrayList;

//数组是有序的
public class BinarySearch {
    
    

    public static void main(String args[]){
    
    
        int arr[] = {
    
    1,8,10,89,1000,1000,1234};

        ArrayList resIndex = binarySearch2(arr,0,arr.length-1,1000);
        System.out.println("resIndex=" + resIndex);
    }

    //二分查找  如果找到返回下标,否则-1
    public static int binarySearch(int[] arr,int left,int right,int findVal){
    
    

        //当left》right结束,没有找到
        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;
        }
    }

    public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal){
    
    

        //当left》right结束,没有找到
        if (left>right){
    
    
            return new ArrayList<>();
        }
        int mid = (left+right)/2;
        int midVal = arr[mid];

        if (findVal>midVal){
    
     //向右递归
            return binarySearch2(arr,mid+1,right,findVal);
        }else if (findVal<midVal){
    
     //左递归
            return binarySearch2(arr,left,mid-1,findVal);
        }else {
    
    

            /**
             * 找到mid索引值不要马上返回
             * 向mid索引左边扫描,满足的元素下标加到list集合
             * 向mid索引右边扫描,满足的元素下标加到list集合
             * 将list返回
             */
            ArrayList<Integer> list = new ArrayList<>();
            int temp = mid-1;
            while(true){
    
    
                if (temp<0 || arr[temp]!=findVal){
    
    
                    break;
                }
                //否则temp放入list
                list.add(temp);
                temp -= 1;
            }
            list.add(mid); //中间的

            //右扫描
            temp = mid+1;
            while (true){
    
    
                if (temp>arr.length-1 || arr[temp]!=findVal){
    
    
                    break;
                }
                list.add(temp);
                temp +=1;
            }
            return list;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/qq_41997237/article/details/116169465
8.3