二分查找,也叫做折半查找,或者叫二分搜索。
这个算法要求被搜索的数据结构已经排序。比起顺序查找要快很多
用递归我们可以很容易的写出这样的算法
function binarySearch(value, arr) {
var mid = Math.floor(arr.length / 2);
if(arr[mid] == value) {
return mid;
}
if(arr[mid] > value) {
return binarySearchValue(0, mid);
} else {
return binarySearchValue(mid+1, arr.length);
}
function binarySearchValue(start, stop) {
/*
@start: 子序列起点,包含
@stop: 子序列终点,不包含
*/
if(start >= stop) {
return -1;
}
var _mid = Math.floor(start + (stop -start)/2);
if(arr[_mid] == value) {
return _mid;
}
if(arr[_mid] > value) {
return binarySearchValue(start, _mid);
} else {
return binarySearchValue(_mid+1, stop);
}
}
}
var arr = [4, 7, 10, 15, 20, 30, 40];
不使用递归的话,
/*
不使用递归实现二分查找
*/
function binarySearch2 (value, arr) {
var start = 0,
stop = arr.length; // stop
mid = Math.floor(stop / 2);
while(stop > start) {
if(arr[mid] == value) {
return mid;
}
if(arr[mid] > value) {
stop = mid;
} else {
start = mid + 1;
}
mid = Math.floor(start + (stop - start) / 2);
}
return -1;
}