JavaScript-二分法详解

本文介绍了二分查找的非递归和递归实现,包括在有序数组中搜索目标值的具体步骤。此外,还讨论了二分排序的复杂度分析,并给出了经典例题,如数组中的最大元素查找和快速排序。同时,提供了力扣上的相关练习题以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分法

二分法又可以被称为二分查找,它描述了在有序集合中搜索特定值的过程。广义的二分查找是将问题的规模尽可能的缩小到原有的一半。

二分查找(非递归实现)

var searchRange = function (nums, target) {
    let start = 0, end = nums.length - 1
    while (start <= end) {
        let mid = Math.floor((start + end) / 2)
        if (nums[mid] == target) {
            return mid
        } else if (nums[mid] > target) {
            end = mid - 1
        } else if(nums[mid] < target){
            start = mid + 1
        }
    }
    return -1
};

二分查找(递归实现)

var searchRange = function (nums, target) {
    let start = 0, end = nums.length - 1
    let mid = - 1
    // 递归函数体,也可以封装最外层函数,就是递归传的参数多一点
    function df(start, end) {
        // 递归终止条件
        if (start > end) return -1
        mid = Math.floor((start + end) / 2)
        if (nums[mid] == target) {
            return mid
        } else if (nums[mid] > target) {
            df(start, mid - 1)
        } else if (nums[mid] < target) {
            df(mid + 1, end)
        }
    }
    df(start, end)
    return mid
}

二分排序

复杂度分析

  • 平均时间复杂度: O(logN)
  • 最坏时间复杂度: O(logN)
  • 最优时间复杂度: O(1)

推荐文章

你真的会写二分查找吗?

经典例题

1 求数组中的最大元素的二分递归算法

let a =[4,6,7,8]
function solution(a,l,r){
   let mid = Math.floor((l+r)/2),max1,max2
   if(l<r){
       max1 = solution(a,l,mid)
       max2 = solution(a,mid+1,r)
       return (max1>max2)?max1:max2
   }else return a[l];
}
console.log(solution(a,0,3));

2 快排
选定一个基准数,要使得基数的左边的数字全部小于它,右边的数字全部大于它。分别设i和j从左右开始寻找,从左边找到第一个比基数大的数,从右边找到第一个比基数小的数,然后交换这两个数。当i和j相遇时,交换基数和i。再以同样的方式处理两边的数组。

const quickSort = (arr, s, e) => {
    if (arr.length <= 1) return
    if (s >= e) return
    let p = arr[s]
    let i = s
    let j = e
    while (i != j) {
        while (arr[j] >= p && i < j) {
            j--
        }
        while (arr[i] <= p && i < j) {
            i++
        }
        if (i < j) {
            let temp = arr[i]
            arr[i] = arr[j]
            arr[j] = temp
        }
    }
    arr[s] = arr[i]
    arr[i] = p
    quickSort(arr, s, i - 1)
    quickSort(arr, i + 1, e)
}
var arr = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
quickSort(arr, 0, arr.length - 1)
console.log(arr)

3.二路归并排序
转载详解

力扣习题

力扣704:二分查找
力扣278:第一个错误版本

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刮刮乐打工仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值