实现二分查找
用二分实现的关键点:
- 凡有序,必二分
- 凡二分,时间复杂度比包含O(logn)
- 可以用递归 和 非递归 两种方式实现
- 递归实现的二分,逻辑更清晰一些
- 用非递归实现,性能更好一些
代码实现:
- 非递归实现二分法
export function binarySearch1(arr:number[],target: number): number{ const length = arr.length; if(length === 0) return -1 let startIndex = 0; //开始位置 let endIndex = length -1;//结束位置 while(startIndex <= endIndex){ const midIndex = Math.floor((endIndex + startIndex) / 2) const midValue = arr[midIndex] if(target < midValue){ endIndex = midIndex -1 }else if(target > midValue){ startIndex = midIndex + 1 }else { return midIndex } } return -1 }
- 递归实现二分法
export function binarySearch2 (arr: number[],target: number, startIndex?: number,endIndex?:number){ const length = arr.length; if(length === 0){ return -1 } startIndex = startIndex || 0 endIndex = endIndex || length -1 // 如果 start 大于 end ,则结束 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 } }
- 测试两种实现的测试用例
/** * @description 二分查找测试 */ import {binarySearch1,binarySearch2} from './binary-search' describe('二分查找测试',() =>{ it('binarySearch1正常查找', ()=>{ const arr = [20,30,40,50,60,70] const res = binarySearch1(arr,60) expect(res).toBe(4) }) it('binarySearch1空数组', ()=>{ const arr: number[] = [] const res = binarySearch1(arr,60) expect(res).toBe(-1) }) it('binarySearch1不存在情况', ()=>{ const arr = [20,30,40,50,60,70] const res = binarySearch1(arr,45) expect(res).toBe(-1) }) it('binarySearch2正常查找', ()=>{ const arr = [20,30,40,50,60,70] const res = binarySearch2(arr,60) expect(res).toBe(4) }) it('binarySearch2空数组', ()=>{ const arr: number[] = [] const res = binarySearch2(arr,60) expect(res).toBe(-1) }) it('binarySearch2不存在情况', ()=>{ const arr = [20,30,40,50,60,70] const res = binarySearch2(arr,45) expect(res).toBe(-1) }) })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!