var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15]; 如这个数组,假如我想找到数组中的5且还是有序数组,如果用for循环来找也行只是代码的执行次数增多,而二分算法查询,是从中间开始查找,一次过滤一半数据前提是有序数组,
如下面例子:
while循环如何结束是个小重点,不然会是死循环,而且中间值不能是小数
//2、在有序的数组里找出指定的值,返回该值在数组中的索引,(二分查找)
var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15];
function getIndex(arr, val) {
var start = 0;
var end = arr.length - 1;
/*
1、这里分别处理了奇数与偶数的情况
2、如果为奇数的话,此时只剩下了三个数字。各自走一次,刚好走到中间。走到同一个位置的话,start==end
3、如果为偶数的话,此时只剩下两个数字。各自己就不需要再走了。再走就超了。start<end
*/
// 0 1 2 3 4 5 6 7 8 9
// var arr = [1, 3, 5, 7, 9, 10, 11, 12, 14, 15];
while (start <= end) {
var middle = parseInt((start + end) / 2);
if (val == arr[middle]) {
return middle;
} else if (val < arr[middle]) {
end = middle - 1; //val < arr[middle]说明要寻找的数字在中间值的左边
} else if (val > arr[middle]) {
start = middle + 1; //val > arr[middle] 说明要寻找的数字在中间值的右边
}
}
return -1; //随便给的,告诉用户使用这个方法的时候如果没有找到你要的数字,我就返回个-1
}
console.log(getIndex(arr, 5)); //2