博客
关于我
二分查找算法
阅读量:377 次
发布时间:2019-03-05

本文共 3743 字,大约阅读时间需要 12 分钟。

二分查找

目录

  • 原理
    1. 实现
      • 2.1 递归实现
      • 2.2 非递归实现
      1. 测试

1. 原理

二分查找是一种高效的查找算法,能够在有序数组中快速定位特定元素。其时间复杂度为 O(log n),因为每次搜索都会将问题规模缩小一半,从而在 logarithmic 时间内完成搜索。

2. 实现

二分查找可以通过递归或非递归方式实现。以下是两种实现方式的代码示例:

2.1 递归实现

import java.util.Arrays;public class BinarySearch {    public static void main(String[] args) {        int[] ints = { -30, -30, -15, -2, 0, 2, 2, 2, 2, 7, 8, 13, 22, 27, 99, 99, 100, 333, 666, 999 };        int key = 2;        System.out.println("数组:" + Arrays.toString(ints));        System.out.println("递归查找:\t数字" + key + "在数组中下标为" + binarySearch(ints, key, true));        System.out.println("非递归查找:\t数字" + key + "在数组中下标为" + binarySearch(ints, key, false));    }    private static int binarySearch(int[] ints, int key, boolean recursion) {        if (ints == null || ints.length == 0) {            return -1;        }        if (recursion) {            return binarySearch(ints, 0, ints.length - 1, key);        } else {            return binarySearch(ints, key);        }    }    private static int binarySearch(int[] ints, int key) {        int from = 0;        int to = ints.length;        while (from < to) {            int mid = from + (to - from) / 2;            if (ints[mid] > key) {                to = mid - 1;            } else if (ints[mid] < key) {                from = mid + 1;            } else {                return mid;            }        }        return -1;    }    private static int binarySearch(int[] ints, int from, int to, int key) {        int mid = from + (to - from) / 2;        if (ints[mid] == key) {            return mid;        }        if (from >= to) {            return -1;        }        if (ints[mid] > key) {            return binarySearch(ints, from, mid - 1, key);        } else {            return binarySearch(ints, mid + 1, to, key);        }    }}

2.2 非递归实现

代码与递归实现的主要区别在于查找过程中没有使用递归函数,而是通过循环实现的逻辑。

3. 测试

运行以下命令进行测试:

D:\program\Java\jdk1.8.0_241\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63454,suspend=y,server=n "-javaagent:C:\Users\GMWANG~1\AppData\Local\Temp\captureAgent8jars\debugger-agent.jar" -Dfile.encoding=UTF-8 -classpath "D:\program\Java\jdk1.8.0_241\jre\lib\charsets.jar;D:\program\Java\jdk1.8.0_241\jre\lib\deploy.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;D:\program\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;D:\program\Java\jdk1.8.0_241\jre\lib\javaws.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jce.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfr.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;D:\program\Java\jdk1.8.0_241\jre\lib\jsse.jar;D:\program\Java\jdk1.8.0_241\jre\lib\management-agent.jar;D:\program\Java\jdk1.8.0_241\jre\lib\plugin.jar;D:\program\Java\jdk1.8.0_241\jre\lib\resources.jar;D:\program\Java\jdk1.8.0_241\jre\lib\rt.jar;D:\project\untitled\out\production\untitled;D:\program\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar" BinarySearchConnected to the target VM, address: '127.0.0.1:63454', transport: 'socket'数组:[-30, -30, -15, -2, 0, 2, 2, 2, 2, 7, 8, 13, 22, 27, 99, 99, 100, 333, 666, 999]递归查找:	数字2在数组中下标为6非递归查找:	数字2在数组中下标为7Disconnected from the target VM, address: '127.0.0.1:63454', transport: 'socket'Process finished with exit code 0

测试结果显示,递归查找和非递归查找均成功找到数字 2 的位置,分别返回了下标 6 和 7。

转载地址:http://oqxwz.baihongyu.com/

你可能感兴趣的文章
JDK安装与环境变量配置(详细基础篇)
查看>>
golang内存及GC分析简易方法
查看>>
SpringCLoud+redis+es高并发项目《十一》
查看>>
技术美术面试问题整理
查看>>
Hibernate Validator常用注解
查看>>
Redis分布式锁原理
查看>>
学习SSM中ajax如何与后台传数据
查看>>
【备份】求极限笔记
查看>>
【备份】概率论笔记备份
查看>>
ES6模块化与commonJS的对比
查看>>
C++学习记录 四、基于多态的企业职工系统
查看>>
C++学习记录 五、C++提高编程(2)
查看>>
面试问道nginx优化怎么做的
查看>>
自学linux毕业shell面试题
查看>>
4 Java 访问控制符号的范围
查看>>
第9章 - 有没有替代原因(检验证据)
查看>>
VUE3(八)setup与ref函数
查看>>
Vue之Element标签页保留用户操作缓存。
查看>>
智能合约开发实践(1)
查看>>
2. Spring Boot学习——Yaml等配置文件教程
查看>>