二分查找的实现
对于数量很小的数据来说,我们一眼便可以找到我们所需要查找的那个数。在日常生活中,很多地方都会用到查找。比如说一个通讯录列表,如果列表里面的数量极少,我们很快就可以找到。但是试想一下,有几万个电话,我们怎么能在短时间内找到我们想要的数据呢?这个时候我们就需要对我们 的数据做一些处理,比如说分类,按照首字母、升序、降序等等,然后按照规则对应的去查找,这样就可以更快的搜索到我们想要的数据。
在计算机中,我们比较容易实现,理解的便是顺序查找。也就是说一个一个挨着比对,直到找到我们数据为止。而现在正是大数据时代,在那么多数据中去查找,恐怕查找的时间会很长,很显然不符合业务需求。在这里笔者就介绍一种经典的查找算法,二分法。二分法的规则是,将一组待查找数据按照一个特定的 序列进行排列,然后每次取出中间值跟我们的待查值比较。如果正好等于它,查找完毕。如果比待查值小,那么待查值就查找后半部分。因为前半部分都比待查值小,所以不需要查找了。然后重复这个过程,直到中间值正好等于待查值,如果数组的最低位比最高位大,则说明这个序列中未查找到元素,直接退出查找。
代码实现:
//迭代实现
function binarySearch(arr, key) {
//首先定义两个变量,获取到当前数组的最小值,以及最大值
var low = 0,
high = arr.length - 1,
mid;
//开始循环,条件是最小值比最大值小或者等于
while (low <= high) {
//找到数组的中间值
mid = Math.floor((low + high) / 2);
//开始作比较
if (key == arr[mid]) {
return mid;
} else if (key < arr[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
// 递归实现
function binary_search(arr, low, high, key) {
if (low > high) {
return -1;
}
var mid = parseInt((high + low) / 2);
if (arr[mid] == key) {
return mid;
} else if (arr[mid] > key) {
return binary_search(arr, low, mid - 1, key);
} else if (arr[mid] < key) {
return binary_search(arr, mid + 1, high, key);
}
};