运用二分法查找目标元素 用java编写

本文介绍了二分法查找的概念,这是一种适用于有序数组的高效查找算法。详细讲述了算法流程,并给出了具体的Java代码实现。总结中强调了在使用二分查找时,判断条件是left <= right的重要性。

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

 

文章目录

一、二分法是什么?

二分法查找:也称折半查找(必须在有序数组查找目标元素的特殊算法)。

算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。

例:在有序的有N个元素的数组中查找用户输进去的数据x。

算法如下:

1.确定查找范围left=0,right=a,lenght-1,计算中项mid=(left+right)/2。

2.若a[mid]=x或left>=right,则结束查找;否则,向下继续。

3.若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给left,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给right,并重新计算mid,转去执行步骤2。

二、具体代码


public class ArrySearch {

    public static void main(String[] args) {
        // 先初始化一个数组
        int []arr = {1,3,5,7,9,11,13};

        int target = 4;//查找的目标元素

        int targetIndex = -1;// 判断输出

        //索引左边
        int left = 0;
        //索引右边
        int right = arr.length - 1;

        // 不知道循环次数,所以使用while循环,结束条件是left <= right    注意:不是left < right
        while (left <= right){
            //中间索引的元素
            int mid = (left + right) / 2;
            if (arr[mid] == target){
                targetIndex = mid;
                break;

            }else if (arr[mid] > target){ //如果中间元素大于查找的元素
                right = mid - 1;
            }else if (arr[mid] < target){ //如果中间元素小于查找的元素
                left = mid + 1;
            }
        }
        if (targetIndex != -1){
            System.out.println("查找的目标元素 " + target +" 所在的索引位置是" + targetIndex);
        }else{
            System.out.println("查找的目标元素 " + target +" 没有找到该元素" );
        }
    }

 

 

总结

注意:是left<=right,而不是left<right.

就是建立在已排序的数组中,不停的对元素进行对半折分,直到找到目标。

### Java中实现二分查找算法 #### 1. 算法简介 二分查找(Binary Search)是一种高效查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过对半分割数据集逐步缩小搜索范围,从而达到优化性能的目的。相比线性查找的时间复杂度 \( O(n) \),二分查找的时间复杂度仅为 \( O(\log n) \)[^2]。 #### 2. 实现方式 以下是基于迭代方法Java代码示例: ```java package Basic; public class BinarySearch { public static int binarySearchBasic(int[] a, int target) { int i = 0, j = a.length - 1; while (i <= j) { // 注意这里的判断条件 int m = (i + j) >>> 1; // 使用无符号右移运算符防止溢出 if (target == a[m]) { // 找到目标值 return m; } else if (target < a[m]) { // 目标值小于中间值,在左半部分继续查找 j = m - 1; } else if (a[m] < target) { // 目标值大于中间值,在右半部分继续查找 i = m + 1; } } return -1; // 如果未找到返回-1 } public static void main(String[] args) { int[] array = {1, 3, 5, 7, 9, 11}; int target = 7; int result = binarySearchBasic(array, target); if (result != -1) { System.out.println("目标值 " + target + " 的索引位置为:" + result); // 输出应为3 } else { System.out.println("目标值不存在于数组中"); } } } ``` 上述代码展示了如何利用迭代方式进行二分查找操作[^3]。其中 `(i + j) >>> 1` 是一种安全计算中间索引的方法,避免了因 `i + j` 可能超出整数范围而导致错误的情况[^4]。 #### 3. 关键点解释 - **初始边界设置**:变量 `i` 和 `j` 分别表示当前搜索区间的起始和结束位置。 - **循环终止条件**:当 `i > j` 时说明区间已为空,此时退出循环并返回 `-1` 表示未找到目标值。 - **更新搜索区间**: - 若目标值等于中间值,则直接返回该索引; - 若目标值小于中间值,则调整上界 `j = m - 1`; - 否则调整下界 `i = m + 1`. 此逻辑确保每次都将搜索空间减半,最终完成整个过程[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值