首先说明一个前提,再用二分法进行查找时,查找对象的数组必须是有序的,当你拿到一个数组之后,你可以先进行排序,然后再利用二分查找
首先举一个简单的例子,让你猜一下100以内的一个正整数N,怎么快速的guess出来呢,首先先猜是不是50?如果猜大了,就往小的方面去guess,可以猜25…,如果猜小了,可以往大了方向guess,可以猜75,就这样一步一步的接近正确的答案
来看第一个例子
while循环
function indexOf(arr,target,start,end){
start = start || 0;
end = end || arr.length - 1;
let mid = Math.floor((start + end)/2);
console.log(start,end);
while(start <= end){
console.log(start,end,target,arr[mid]);
if(target > arr[mid]){
start = mid + 1;
mid = Math.floor((start + end)/2);
}
else if(target < arr[mid]){
end = mid - 1;
mid = Math.floor((start + end)/2);
}
else {
return mid ;
}
}
console.log(start,end);
return -1;
}
let a = [0,1,2,3,4,5,6,383,565];
console.log(indexOf(a,5)); //打印结果为5
第一步
声明开始的值和结束的值,分别是0和数组长度-1
第二步
声明中间值mid=(start+end)/2并取整数
第三步
用while循环
如果我们要找的这个target>arr[mid],那说明target只可能在mid+1~end之间,
意思就是猜小了,要往大的方向猜
如果我们要找的这个target<arr[mid],那说明target只可能在start~mid-1之间
,意思就猜大了,得往小的方向猜
如果我们要找的这个target==arr[mid],那恭喜你,猜对了
在用二分法进行查找时,查找对象的数组必须是有序的,即各数组元素的次序是按其值的大小顺序存储的。其基本思想是先确定待查数据的范围(可用 [left,right] 区间表示),然后逐步缩小范围直到找到或找不到该记录为止。二分法可以用递归或者循环的方式实现。