java二分查找

本文详细介绍了二分查找算法的工作原理,包括步骤、时间复杂度以及Java代码示例。它强调了这种算法在有序数据集中的高效性,适合于减少大规模数据搜索时间。
摘要由CSDN通过智能技术生成

定义

二分查找是一种用于在有序数组或列表中查找特定元素的高效算法。它的工作原理是将待查找的区间不断缩小为一半,直到找到目标元素或确定目标元素不存在为止。以下是二分查找的基本步骤和解释:

解释:

  1. 初始化:首先,确定查找范围的起始和结束位置。通常,这是整个数组或列表的起始和结束位置。

  2. 计算中间位置:计算查找范围的中间位置,即 (起始位置 + 结束位置) / 2

  3. 比较中间元素:将目标元素与中间位置的元素进行比较。

    • 如果中间元素等于目标元素,搜索成功,返回中间位置。
    • 如果中间元素小于目标元素,说明目标元素在中间元素的右侧,因此将查找范围缩小为右半部分,更新起始位置为中间位置加一。
    • 如果中间元素大于目标元素,说明目标元素在中间元素的左侧,因此将查找范围缩小为左半部分,更新结束位置为中间位置减一。
  4. 重复步骤2和步骤3,直到找到目标元素或起始位置大于结束位置。如果起始位置大于结束位置,表示目标元素不在数组或列表中,搜索失败。

时间复杂度

二分查找的关键是每次都将查找范围缩小一半,因此它的时间复杂度是 O(log n),其中 n 是数组或列表的大小。这使得它在大型数据集上比线性搜索更加高效。但要注意,二分查找要求数据必须有序,否则无法正常工作。

总之,二分查找是一种快速有效的查找算法,适用于有序数据集。它通过不断缩小查找范围,减少了搜索的时间复杂度,是许多编程任务中常用的工具之一。

 代码实例

import java.util.Arrays;
import java.util.Scanner;

public class BinarySearch {
    public static int binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            if (arr[mid] == target) {
                return mid; // 找到目标元素,返回索引
            } else if (arr[mid] < target) {
                left = mid + 1; // 目标元素在右半部分
            } else {
                right = mid - 1; // 目标元素在左半部分
            }
        }

        return -1; // 没有找到目标元素
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要查找的目标元素:");
        int target = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        System.out.print("请输入要查找的数组(以空格分隔):");
        String inputArray = scanner.nextLine();

        String[] inputValues = inputArray.split("\\s+");
        int[] arr = new int[inputValues.length];

        for (int i = 0; i < inputValues.length; i++) {
            try {
                arr[i] = Integer.parseInt(inputValues[i]);
            } catch (NumberFormatException e) {
                System.out.println("输入的数组不是有效的整数数组。");
                return;
            }
        }

        // 首先对数组进行排序
        Arrays.sort(arr);

        int result = binarySearch(arr, target);

        if (result != -1) {
            System.out.println("目标元素 " + target + " 在索引 " + result + " 处找到。");
        } else {
            System.out.println("目标元素 " + target + " 未找到。");
        }

        // 输出排好序的数组
        System.out.print("排好序的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

运行截图

 代码解释

该程序允许用户自己输入要查找的目标元素 和要查找的数组(用户输入的数组会自动排序)

这里导入了 Arrays 类用于对数组排序,以及 Scanner 类用于从控制台读取用户的输入。

定义 binarySearch 方法:这个方法接受一个有序整数数组 arr 和目标元素 target,然后执行二分查找,返回目标元素的索引(如果找到)或 -1(如果未找到)。

如果输入的数组不是有效的整数数组,它还会进行错误处理。

for (int num : arr)

这是一个增强 for 循环的语法,它会依次将数组 arr 中的每个元素赋值给变量 num,然后执行循环体 

System.out.print(num + " ")

在循环体内,我们使用 System.out.print() 方法将当前元素 num 输出到控制台,同时在元素之后添加一个空格,以便将元素以空格分隔的形式输出。

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值