**前言**
今天是坚持每天写代码的第三天,突然觉得坚持做一件事真的还挺难的,现在已是深夜,但是我还是想坚持写点东西,告诉自己无论如何也要坚持去做一件事情,迫使自己养成一个主动总结自己知识结构的习惯。今天没太多时间去写比较复杂的小界面or小功能。所以就回顾下我们之前在学校学习数据结构时候学过的一些算法吧。今天重点来回顾下比较简单的二分查找算法。
**二分查找算法:**
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
今天我就写一个用javascript实现的二分查找算法。
~~~
//定义一个函数用于实现二分查找算法
function search_key(data_array,search){
var data_array_length = data_array.length;
var start = 0;
var end = data_array_length - 1;
var middle = 0;
while(start<=end){
middle = parseInt((start+end)/2);
if(data_array[middle]>search){
end = middle - 1;
}else if(data_array[middle]<search){
start = middle + 1;
}else{
return middle;
}
}
return -1; //不存在
}
//定义一个有序数组。意思就是我们的数组的元素是已将排好序的。
var data_arr = [23,34,48,60,68,80,98,120];
//我们要解决的问题是,比如我想找到data_arr这个数组中的60这个数值,是在数组的哪个位置。我该怎么快速的找到
//调用函数计算并找出 60所在的位置
var search = 60;
var result = search_key(data_arr,search);
if(result==-1){
alert("主人很抱歉,您找的元素不存在哦!!!");
}else{
alert("主人您要的元素找到了,所在的位置为:"+(result+1));
}
~~~
今天解决的问题就是如何在一个有序的列表中快速的找到我们想要找的元素。这个问题设定了限制条件 有序列表。二分查找的解决思路就是先去比较中间位置的元素是否跟我们要查找的元素相等,然后即可将查找的范围锁定到整个区间的一半,后续逐步缩减范围,直到找到满足条件的结果。所以效率还是挺高的。
这里我抛出一个问题,如果我们不用二分查找来实现,按照正常的思路你会怎么解决呢?或者说除了我这样的写法,您还有其他更好的实现么?这个问题留给大家,大家来思考如何解决,欢迎和我交流互动。