迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 算法 >

如何在 Java 中不使用递归实现二分查找?

作者:迹忆客 最近更新:2023/02/06 浏览次数:

嘿 Java 程序员,如果你想在 Java 中实现二分搜索,并寻找迭代和递归二分搜索算法,那么你来对地方了。 今天要教大家一个重要的算法。 在计算机科学中,二分搜索或半区间搜索是一种分而治之的算法,它定位一个项目在排序数组中的位置。 二分搜索通过将输入值与数组的中间元素进行比较来工作。 比较确定元素是否等于输入、小于输入或大于输入。

当被比较的元素等于输入时,搜索停止并通常返回元素的位置。 如果元素不等于输入,则进行比较以确定输入是小于还是大于元素。

根据它是什么算法然后重新开始但只搜索数组元素的顶部或底部子集。 如果输入不在数组中,算法通常会输出一个唯一值来指示这一点。

二分搜索算法通常在每次连续迭代中将要检查的项目数量减半,从而在对数时间内定位给定项目(或确定其不存在)。

二分查找是一种分而治之的查找算法。 它的工作原理是将输入集分成两半,然后应用算法并重复相同的步骤,直到工作完成。

二分搜索与线性搜索运行时 Grokking 算法

没有递归的 Java 二分搜索它也非常直观,充满了有用的图表,很好地解释了这些概念。 例如,在上图中,我们可以看到当元素数量增加时,线性搜索变得越来越慢,但二分搜索却没有。 例如,对于 40 亿个项目,二分查找只需要 32 个猜测


没有递归的 Java 中的二分搜索示例

该算法是递归实现的。 此外,关于 Java 中二分搜索实现的一个有趣事实是,著名的 Effective Java 书籍的作者 Joshua Blochjava.util.Arrays 中实现了二分搜索。

import java.util.Arrays;

/**
 * 实现二进制搜索的 Java 程序。
 */
public class Main {
    public static void main(String args[]) {
        int[] list = new int[]{23, 43, 31, 12};
        int number = 12;
        Arrays.sort(list);
        System.out.printf("Binary Search %d in integer array %s %n", number, Arrays.toString(list));
        binarySearch(list, 12);
        System.out.printf("Binary Search %d in integer array %s %n", 43, Arrays.toString(list));
        binarySearch(list, 43);
        list = new int[]{123, 243, 331, 1298};
        number = 331;
        Arrays.sort(list);
        System.out.printf("Binary Search %d in integer array %s %n", number, Arrays.toString(list));
        binarySearch(list, 331);
        System.out.printf("Binary Search %d in integer array %s %n", 331, Arrays.toString(list));
        binarySearch(list, 1333);
        Arrays.sort(list);
        int index = Arrays.binarySearch(list, 3);
    }

    /**
     * 在 Java 中的排序数组中执行二分搜索
     * @param input
     * @param number
     * @return 元素在数组中的位置
     */
    public static void binarySearch(int[] input, int number) {
        int first = 0;
        int last = input.length - 1;
        int middle = (first + last) / 2;
        while (first <= last) {
            if ( input[middle] < number){
                first = middle + 1;
            } else if (input[middle] == number) {
                System.out.printf(number + " found at location %d %n", middle);
                break;
            } else {
                last = middle - 1;
            }
            middle = (first + last) / 2;
        } if ( first > last){
            System.out.println(number + " is not present in the list.\n");
        }
    }
}

执行结果如下

Java 中不使用递归实现二分查找结果

这就是关于如何在没有递归的情况下在 Java 中实现二进制搜索算法的全部内容。 与任何递归算法一样,此代码不使用任何循环,如 whilefordo-while 循环。 理想情况下,我们不需要为日常任务的二分搜索编写代码,因为 Java 库已经有一个 binarySearch() 方法,但了解如何编写这些算法有助于面试。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Do you understand JavaScript closures?

发布时间:2025/02/21 浏览次数:108 分类:JavaScript

The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.

Do you know about the hidden traps in variables in JavaScript?

发布时间:2025/02/21 浏览次数:178 分类:JavaScript

Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av

How much do you know about the Prototype Chain?

发布时间:2025/02/21 浏览次数:150 分类:JavaScript

The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start

JavaScript POST

发布时间:2024/03/23 浏览次数:96 分类:JavaScript

本教程讲解如何在不使用 JavaScript 表单的情况下发送 POST 数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便