二分搜索
二分搜索(binary search),也称折半搜索、对数搜索,是一种在有序数组中查找某一特定元素的搜索算法。
原理
二分搜索算法的原理和猜数字游戏类似,就是有人让你从1~100之间选一个数字让他猜,他告诉你猜测的数字,你回复他猜测的数字,大了、小了还是猜对了,最后通过几次猜测,成功猜测出你选的数字。
步骤
从数组的中间元素开始,如果中间元素正好是要查找的元素,则返回数组下标搜索结束;
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果直到数组为空,也没找到,则返回-1。
代码实现
Array.prototype.binarySearch = function (item){
if(!this.length) return -1;
//注意:二分搜索必须在有序数组中进行
this.sort((a, b)=> a-b);
let start = 0, end = this.length-1;
while(start <= end){
let mid = Math.floor((start+end)/2);
let result = this[mid];
if(item > result){
start = mid+1;
}else if(item < result){
end = mid-1;
}else{
return result;
}
}
return -1;
}
用例测试
时间复杂度
二分搜索不会查找数组的全部元素,而查找的数据量其实正好符合元素的对数,正常情况下每次查找的元素都在一半一半地减少。所以二分搜索的时间复杂度为 O(logn)
。
二分搜索最好的情况是只查找一次就能找到,最坏的情况下是的查找O(log n)次。