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
            }
        }
相关推荐
coding随想几秒前
JavaScript中的系统对话框:alert、confirm、prompt
开发语言·javascript·prompt
皮蛋sol周5 分钟前
嵌入式学习C语言(八)二维数组及排序算法
c语言·学习·算法·排序算法
LuckyLay8 分钟前
使用 Docker 搭建 Rust Web 应用开发环境——AI教你学Docker
前端·docker·rust
pobu16827 分钟前
aksk前端签名实现
java·前端·javascript
森焱森29 分钟前
单片机中 main() 函数无 while 循环的后果及应对策略
c语言·单片机·算法·架构·无人机
烛阴32 分钟前
带参数的Python装饰器原来这么简单,5分钟彻底掌握!
前端·python
0wioiw037 分钟前
Flutter基础(前端教程⑤-组件重叠)
开发语言·前端·javascript
平和男人杨争争1 小时前
机器学习12——支持向量机中
算法·机器学习·支持向量机
冰天糖葫芦1 小时前
VUE实现数字翻牌效果
前端·javascript·vue.js