Several forms of binary search

package search;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by guipengfei on 2020/8/28 15:45
 * 
 * 1.binarySearch1采用递归形式实现二分查找
 * 2.binarySearch2也采用递归形式实现二分查找,但是对bianrySearch1做出了改进,可以查找出所有相同的元素
 * 3.binarySearch3采用的是非递归形式实现的二分查找
 */
public class BinarySearch {
    
    
    public static void main(String args[])
    {
    
    
        int arr1[] = {
    
     1, 8, 10, 89,1000, 1234 };
        System.out.println(binarySearch1(arr1,0,arr1.length-1,10));
        int arr2[] = {
    
     1, 8, 10, 89,1000,1000,1000, 1234 };
        System.out.println(binarySearch2(arr2,0,arr2.length-1,1000));
        System.out.println(binarySearch3(arr1,0,arr1.length-1,10));
    }
    public static int binarySearch1(int arr[],int left,int right,int keyVal)
    {
    
    
        if(left>right)
            return -1;
        int mid=(left+right)/2;
        if(keyVal>arr[mid])
            return binarySearch1(arr,mid+1,right,keyVal);
        else if(keyVal<arr[mid])
            return binarySearch1(arr,left,mid-1,keyVal);
        else
            return mid;
    }

    public static List<Integer> binarySearch2(int arr[],int left,int right,int keyVal)
    {
    
    
        if(left>right)
            return new ArrayList<Integer>();//没有找到则返回一个空集合
        int mid=(left+right)/2;
        if(keyVal>arr[mid])
            return binarySearch2(arr,mid+1,right,keyVal);
        else if(keyVal<arr[mid])
            return binarySearch2(arr,left,mid-1,keyVal);
        else {
    
    
            List<Integer> resIndexlist = new ArrayList<Integer>();
            int temp=mid-1;
            while (true)
            {
    
    
                if(temp<0||arr[temp]!=arr[mid])
                    break;
                resIndexlist.add(temp);
                temp--;

            }
            resIndexlist.add(mid);
            temp=mid+1;
            while (true)
            {
    
    
                if(temp>arr.length-1||arr[temp]!=arr[mid])
                    break;
                resIndexlist.add(temp);
                temp++;

            }
            return resIndexlist;
        }

    }
    public static int binarySearch3(int arr[],int left,int right,int keyVal)
    {
    
    
        int res=-1;
        while (true)
        {
    
    
            if(left>right)
                break;
            int mid=(left+right)/2;
            if(keyVal>arr[mid])
                left=mid+1;
            else if(keyVal<arr[mid])
                right=mid-1;
            else
            {
    
    
                res=mid;
                break;
            }

        }
        return res;
    }
}

Guess you like

Origin blog.csdn.net/qq_43478694/article/details/108281660