二分查找的前提必须是有序表顺序存储,当其是静态的时候(经过一次排序后不再变化数据)效率是可观的。
思想:从中间元素开始比较,若相等则返回元素位置;若不相等则与中间元素比较大小,根据大小关系和表的排序方式确定下一次要查找的部分,依次递归执行,直到查找到结果返回元素位置或者查找结束发现无此元素返回-1。
对于n个元素查找
最好情况:1次,
最坏情况:
当n=1时,次数为1
当n>1时,次数为Math.ceil(log2
n)
时间复杂度为:O(log2
n)
优点:比较次数较少,查找速度快,平均性能好
缺点:必须是有序表
JS代码如下
function search (arr, num) {
var index = -1;
var left = 0,
right = arr.length-1;
while(left < right){
var middle = parseInt((left+right)/2)
if (num == arr[middle]) {
index = middle;
return index;
} else if (num > arr[middle]) {
left = middle+1;
} else {
right = middle;
}
}
return index;
}
testing:
var a = [2,4,7,10,11,14,15,19,21,23,27]
console.log(search(a,2))