java二分查找代码实现

package drug.search;

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

/**
 * @author Drug
 * @create 2020-04-28 14:26
 */
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {141,141,141,141,1231,1234,1485,1499};
        List<Integer> integers = binarySearch2(arr, 0, arr.length, 141);
        Collections.sort(integers);
        System.out.println(integers);
    }

    /**
     * 二分查找
     * @param arr 数组
     * @param left 左
     * @param right 右
     * @param value 查找的数值
     * @return
     */
    public static int binarySearch(int[] arr,int left,int right,int value){
        //递归最后没找到
        if(left > right){
            return -1;
        }
        //中间值
        int mid = (left+right)/2;
        int midValue = arr[mid];
        //开始判断中间值和查找值的大小
        if(value > midValue){
            //向右递归
            return binarySearch(arr, mid+1, right, value);
        }else if(value < midValue){
            //向左递归
            return binarySearch(arr, left, mid-1, value);
        }else {
            //找到了
            return mid;
        }
    }

    /**
     * 二分查找优化版
     * @param arr 数组
     * @param left 左
     * @param right 右
     * @param value 查找的数值
     * @return
     */
    public static List<Integer> binarySearch2(int[] arr, int left, int right, int value){
        //递归最后没找到
        if(left > right){
            return new ArrayList<>();
        }
        //中间值
        int mid = (left+right)/2;
        int midValue = arr[mid];
        //存放结果
        List<Integer> list = new ArrayList<>();
        //开始判断中间值和查找值的大小
        if(value > midValue){
            //向右递归
            return binarySearch2(arr, mid+1, right, value);
        }else if(value < midValue){
            //向左递归
            return binarySearch2(arr, left, mid-1, value);
        }else {
            //找到了
            list.add(mid);
            //向右继续找
            int temp = mid+1;
            while(temp<=right && arr[temp] == value){
                list.add(temp);
                temp++;
            }
            //向左继续找
            temp = mid-1;
            while(temp>=left && arr[temp] == value){
                list.add(temp);
                temp--;
            }
            return list;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值