今天跟大家分享一个比较简单且比较实用的搜索算法 -- 折半查找
二分查找
也叫折半查找
,是我们在有序(注意: 是有序)数组中查找元素的高效算法。
很多大家熟悉的地方也使用了二分查找
这种方式。比如:git bisect
好了,闲话不说,我们开始今天的分享。
1. 二分查找
解释:什么叫二分查找呢?顾名思义,就是将我们需要查找的数组不断的切分两份,直到找到要查找的元素。
这里要注意一点,一定要是有个有序的数组
栗子🌰:
const arr = [ 2, 3, 4, 5, 6, 7, 12, 34, 42, 45, 52, 67, 68, 84, 86 ];
function binarySearch (arr, value) {
if (arr.length <= 0) {
return -1
}
let start = 0
let end = arr.length - 1
while(start <= end) {
// 不停的取中间值
let mid = Math.floor((start + end) / 2)
// 找到元素后,返回索引
if (value === arr[mid]) {
return mid
}else if (value < arr[mid]) {
// 当前值 大于 要查找的值
end = mid - 1
} else if (value > arr[mid]) {
// 当前值 小于 要查找的值
start = mid + 1
}
}
// 找不到,返回-1
return -1
}
console.log(binarySearch(arr, 67));
说明:
- 这里我们认为传入的数组都是有序的。
- 如果数组的长度为
0
,则表明没有需要查找的元素,返回-1
- 从数组开始位置
start
,查找到数组结束位置end
- 定义一个中间值
mid
,判断中间值与目标值的对比。-
目标值比中间值大,说明要查找的元素位于中间值右侧。若目标值为
67
,第一次中间值为34
,目标值位于中间值右侧。查找右侧数组 -
目标值比中间值小,说明要查找的元素位于中间值左侧。若目标值为 4 ,第一次中间值为
34
,目标值位于中间值左侧。查找左侧数组
-
目标值比中间值大,说明要查找的元素位于中间值右侧。若目标值为
- 当查找完数组之后依然没有查找到目标值,则返回
-1
二分查找是一种比较简单的算法,但是依然有很多人并不能写出来正确的解答。
这里还是要提醒大家一点,千万别死记硬背代码,一定要理解思路,理解了思路之后才会有层出不穷的解决方式,而不是固守一种方法。
好了,今天的分享就到这里了。我们下次再见
Bye~