Java基础数组-二分查找算法

简介: Java基础数组-二分查找算法

关于查找算法中的:二分法查找。


10(下标0) 11 12 13 14 15 16 17 18 19 20(下标10) arr数组。

通过二分法查找,找出18这个元素的下标:


(0 + 10) / 2 --> 中间元素的下标: 5

拿着中间这个元素和目标要查找的元素进行对比:


中间元素是:arr[5] --> 15

15 < 18(被查找的元素)

被查找的元素18在目前中间元素15的右边。

所以开始元素的下标从0变成 5 + 1.

再重新计算一个中间元素的下标:


开始下标是:5 + 1

结束下标是:10

(6 + 10) / 2 --> 8

8下标对应的元素arr[8]是18

找到的中间元素正好和被找的的元素18相等,表示找到了:下标为8


二分法查找的终止条件:一直折半,直到中间的那个元素恰好是被查找的元素。


二分法查找算法是基于排序的基础之上。(没有排序的数据是无法查找的。)


二分法查找效率要高于“一个挨着一个”的这种查找方式。


二分法查找原理:


10(0下标) 23 56 89 100 111 222 235 500 600(下标9) arr数组

目标:找出600的下标

(0 + 9) / 2 --> 4(中间元素的下标)

arr[4]这个元素就是中间元素:arr[4]是 100

100 < 600

说明被查找的元素在100的右边。

那么此时开始下标变成:4 + 1


(5 + 9) / 2 --> 7(中间元素的下标)

arr[7] 对应的是:235

235 < 600

说明被查找的元素在235的右边。


开始下标又进行了转变:7 + 1

(8 + 9) / 2 --> 8

arr[8] --> 500

500 < 600

开始元素的下标又发生了变化:8 + 1

(9 + 9) / 2 --> 9

arr[9]是600,正好和600相等,此时找到了。


示例代码:


public class ArrayUtil {
    public static void main(String[] args) {
        int arr[] = {100,200,230,235,600,1000,2000,9999};
        int index = binarySearch(arr,9999);
        System.out.println(index == -1 ? "该元素不存在" : "该元素的下标为:" + index);
    }
    /**
     *从数组中查找目标元素的下标
     * @param arr 被查找的数组(这个必须是已经排序的)
     * @param dest 目标元素
     * @return -1表示该元素不存在,其次它表示返回该元素的下标
     */
    public static int binarySearch(int[] arr, int dest) {
        //开始元素下标
        int begin = 0;
        //结束元素下标
        int end = arr.length-1;
        //开始元素的下标只要在结束元素下标的左边,就有机会继续循环
        while(begin <= end) {
            //中间元素下标
            int mid = (begin + end) / 2;
            if (arr[mid] == dest) {
                return mid;
            } else if (arr[mid] < dest) {
                //目标在中间的右边
                //开始元素下标需要发生变化(开始元素的下标需要重新赋值)
                begin = mid + 1;//一直增
            }else {
                //arr[mid] < dest
                //目标元素在中间的左边
                //修改结束元素的下标
                end = mid - 1;//一直减
            }
        }
        return -1;
    }


运行结果:


0a2653c851af460fa595bd959398a8f1.png

相关文章
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
72 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
33 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
32 4
|
1月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
30 2
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
Java
在 Java 中实现二分查找法
【10月更文挑战第9天】
27 1
|
1月前
|
算法 C# 索引
C#二分查找算法
C#二分查找算法
|
1月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
24 3
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
23 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
35 0
下一篇
无影云桌面