algorithm:二分查找

本文介绍了一种高效的搜索算法——二分查找,并通过两种实现方式(递归与非递归)展示了如何在有序数组中查找指定元素及其所有重复出现的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr1 = {-1, -1, 1, 4, 9, 19, 19, 19, 34};
        List<Integer> index1 = binarySearch(arr1, 0, arr1.length -1, 19);
        // 递归方法
        if (index1.size() == 0) {
            System.out.println("该数未找到!");
        } else {
            System.out.println("该数在第" + index1 + "位。");
        }

        // 非递归方法,简单一点
        int[] arr2 = {-1, 1, 4, 9, 19, 34};
        int index2 = binarySearch(arr2, 19);
        if (index2 == -1) {
            System.out.println("该数未找到!");
        } else {
            System.out.println("该数在第" + index2 + "位。");
        }
    }

    // 二分查找的前提是:该数组是有序的
    // 时间复杂度O(log2n),最多需要查找7次,2^6 < 100 < 2^7

    // 递归方法
    public static List<Integer> binarySearch(int[] arr, int start, int end, int value) {
        if (start <= end && value >= arr[0] && value <= arr[arr.length - 1]) {
            int mid = (start + end) / 2;
            int midValue = arr[mid];
            if (value < midValue) {
                return binarySearch(arr, start, mid - 1, value);
            } else if (value > midValue) {
                return binarySearch(arr, mid + 1, end, value);
            } else {
                // 找到下标mid之后,查找mid左边和右边同样满足的元素,加到集合ArrayList中
                List<Integer> list = new ArrayList<>();

                int temp1 = mid - 1;
                while (temp1 >= 0 && arr[temp1] == value) {
                    list.add(temp1);
                    // temp左移,寻找左边同样相等的数组元素
                    temp1--;
                }

                list.add(mid);

                int temp2 = mid + 1;
                while (temp2 <= arr.length - 1 && arr[temp2] == value) {
                    list.add(temp2);
                    // temp左移,寻找左边同样相等的数组元素
                    temp2++;
                }
                return list;
            }
        }
        return new ArrayList<>();
    }

    // 非递归方法
    public static int binarySearch(int[] arr, int value) {
        int start = 0;
        int end = arr.length - 1;
        while (start <= end) {
            int mid = (start + end) / 2;
            if (arr[mid] == value) {
                return mid;
            } else if (arr[mid] < value) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值