JS 【算法】二分查找

使用场景

在有序数组中查找目标元素

js 复制代码
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const target = 2
console.log(binarySearch1(arr, target))
console.log(binarySearch2(arr, target))

循环实现

js 复制代码
        function binarySearch1(arr, target) {
            const length = arr.length
            if (length === 0) return -1

            let startIndex = 0 // 开始位置
            let endIndex = length - 1 // 结束位置

            while (startIndex <= endIndex) {
                const midIndex = Math.floor((startIndex + endIndex) / 2) // 中间位置
                const midValue = arr[midIndex]
                if (target < midValue) {
                    // 目标值较小,则继续在左侧查找
                    endIndex = midIndex - 1
                } else if (target > midValue) {
                    // 目标值较大,则继续在右侧查找
                    startIndex = midIndex + 1
                } else {
                    // 相等,则返回
                    return midIndex
                }
            }

            return -1 // 未找到
        }

递归实现

js 复制代码
        function binarySearch2(arr, target, startIndex, endIndex) {
            const length = arr.length
            if (length === 0) return -1

            // 开始和结束的范围
            if (startIndex == null) startIndex = 0
            if (endIndex == null) endIndex = length - 1

            // 开始和结束相遇,则结束
            if (startIndex === endIndex) return -1

            // 中间位置
            const midIndex = Math.floor((startIndex + endIndex) / 2)
            const midValue = arr[midIndex]

            if (target < midValue) {
                // 目标值较小,则从左侧寻找
                return binarySearch2(arr, target, startIndex, midIndex - 1)
            } else if (target > midValue) {
                // 目标值较大,则从右侧查找
                return binarySearch2(arr, target, midIndex + 1, endIndex)
            } else {
                // 相等,则返回
                return midIndex
            }
        }
相关推荐
Jolyne_2 分钟前
【浏览器插件】一键下载页面图片和文本
前端
Jony_6 分钟前
Android 类加载机制
前端·客户端
程序员buddha8 分钟前
C语言操作符详解
java·c语言·算法
im_AMBER9 分钟前
HTTP概述 01
javascript·网络·笔记·网络协议·学习·http
1024小神19 分钟前
在 Swift 中,参数标签(argument label),用于在调用函数时提高代码的可读性。
前端
思茂信息22 分钟前
CST电动车EMC仿真(二)——电机控制器MCU的EMC仿真
开发语言·javascript·单片机·嵌入式硬件·cst·电磁仿真
John_Rey24 分钟前
API 设计哲学:构建健壮、易用且符合惯用语的 Rust 库
网络·算法·rust
愿没error的x24 分钟前
动态规划、贪心算法与分治算法:深入解析与比较
算法·贪心算法·动态规划
joker学java26 分钟前
el表达式jstl和我们的js都是什么时候使用
前端
晴殇i26 分钟前
前端极速性能优化:从加载到渲染的全链路实战指南
前端·javascript