栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

定义一个二分查找法的函数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

定义一个二分查找法的函数

注:如果来学习建议一点一点看,想要成品请直接翻到文末复制

所谓二分查找法,是一种在有序数组里快速查找元素的方法。通过不断搜索中间值来定位元素在这个有序数组里的位置;

今天用Javascript写出这个查找方法的逻辑,并封装成函数

定义一个函数,名为halfSearch,接受的参数是 升序数组 和 查找的元素。它将会返回元素的索引

function halfSearch(arr,targetItem){
}
重点1:搜索中间值

定义两个变量,分别是搜索的起始位置和结束位置,然后对比起始位置与结束位置最中间位置的元素

function halfSearch(arr,targetItem){
	var fromLeft=0;
	var toRight=arr.length;
	var find=(toRight-fromLeft)/2 + fromLeft;
	if(arr[find]==targetItem){
		return find;
	}
}
重点2:缩小搜索范围

当得到的数小了的时候把左指针放数组中间,重新查找。

反过来,数大了就把右指针放数组中间。

function halfSearch(arr,targetItem){
	var fromLeft=0;
	var toRight=arr.length-1;
	while(arr[find]!=targetItem){
		var find=Math.floor( (toRight-fromLeft)/2 + fromLeft )
		if(arr[find] 
BUG:有些时候while循环会卡住。 

原因:find是一个数除以二得来的,可能会冒出一个0.5

解决:添加Math.floor取整

function halfSearch(arr,targetItem){
	var fromLeft=0;
	var toRight=arr.length-1;
	while(arr[find]!=targetItem){
		var find=Math.floor( (toRight-fromLeft)/2 + fromLeft )
		if(arr[find] 
BUG:当没有找到元素时while循环也会卡住 

解决:添加判断,当左指针和右指针相等或者差值为1就返回-1

function halfSearch(arr,targetItem){
	var fromLeft=0;
	var toRight=arr.length-1;
	while(arr[find]!=targetItem){
		var find=Math.floor( (toRight-fromLeft)/2 + fromLeft )
		if(arr[find] 

BUG:如果数在最右边,无法搜索到值 

修复:toRight的初始值从length-1修改成length

function halfSearch(arr,targetItem){
	var fromLeft=0;
	var toRight=arr.length;
	while(arr[find]!=targetItem){
		var find=Math.floor( (toRight-fromLeft)/2 + fromLeft )
		if(arr[find]targetItem){
			//猜大了
			toRight=find;
		}
		if(toRight-fromLeft<=1&&arr[toRight]!=targetItem&&arr[fromLeft]!=targetItem){
			return -1
		}
	}
	return find
}

简单测试

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995437.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号