什么是二分查找?
其实就是能在一组经过排序的数组中快速查找数据
什么叫快速呢?如果用最笨的方法查找字典里面的一个字你会一个一个对比还是直接从中间开始查找呢,很明显从中间差汇总啊跟块,二分查找又叫折半查找,
接下来我们开始比较在1~100中查找一个数字,
更佳的查找方式:
直接从50开始查找,如果小了,但排除了一半的数字!至此,你知道1~50都小了。
接下来,你猜75大了, 那余下的数字又排除了一半!使用二分查找时,你猜测的是中间的数字,从而每次都将余下的数字排除一半。接下来,你猜63( 50和75中间的数字)......
这就是二分查找.不管我心里想的是哪个数字,你在7次之内都能猜到
需求思路有了,那我们就开始小心翼翼的写代码吧.
// 接受实参传递过来的数组和要查找的数字
function binary_search(arr, key) {
var low = 0,
high = arr.length - 1;
//查找方向
while(low <= high){
// 折半 parseInt转换为整数
// 13+0/2
var mid = parseInt((high + low) / 2);
if(key == arr[mid]){
return mid;
}else if(key > arr[mid]){
low = mid + 1;
}else if(key < arr[mid]){
high = mid -1;
}
}
return -1;
};
var arr = [1,2,3,4,5,6,7,8,9,10,11,56,57,60];
console.log(arr.length);
var result = binary_search(arr,11);
alert(result); // 返回索引值
1.比较是否与key(你需要查找的数字)相等
2.如果不相等的话会继续判断是大了还是小了。如果key的值比猜到的值大那么,就会执行
low = mid + 1;
执行完后这时low就变为7,high不变,这时就判断数组索引号07(low)到13(high)的数字
3.一次反复运算最后key == arr[mid]成立的时候就返回值,最后弹窗输出需要查找的数的索引号。
总结:如果列表包含100个元素,最多要猜7次;如果列表包含40亿个数字,最多需猜32次。厉害吧。