顺序查找之二分法查找:
二分法查找算法思想:
1.二分法查找算法:数据是需要有序排列的:比如升序排列/降序排列的数据;
2.主要思想:
1.设置查找的数据区间array[start,end];
2.确定该区间的中间位置index:m;
3.假设查找值为T(target);
4.如果T与array[m]相等,则查找成功,返回此位置;
5.否则确定新的查找范围,继续二分查找;
举例:升序排列的数据arrInc[start,end];
如果arrInc[m]>T;由于数组的有序性,arrInc[m,....e]>T;
因此新的查找区间是arrInc[s,m-1];
,每次查找都与中间值比较,判断是否成功,不成功,则当前查找区间缩小一半;
时间复杂度O(log2n);
复制代码
talk is cheap ,show me the code:
// 二分查找
Array.prototype.binarySearch=function(arrObj,target){
let s=0,
e=arrObj.length-1,
m=Math.floor((s+e)/2),
sortFlag=arrObj[s]<=arrObj[e];// 申明排列顺序;
// 通过while循环判断
while(s<e && arrObj[m]!==target) {
if(arrObj[m]>target){
// 如果是升序,则e=m-1;
sortFlag&&(e=m-1);
// 如果是降序,则s=m+1
!sortFlag&&(s=m+1);
}else{
//如果是升序则s=m+1
sortFlag&&(s=m+1);
// 如果是降序,e=m-1
!sortFlag&&(e=m-1);
}
}// end of while loop;
if(arrObj[m]==target){
console.log(m,arrObj[m]);
return m;
}else{
console.log("the target not found!");
return -1;
}
}复制代码