// 二分查找, 找到第一个大于等于num的位置 (数组必须从小到大排好序,且不重复)
// 二分查找, 找到第一个大于等于num的位置 (数组必须从小到大排好序,且不重复)
Array.prototype.binarySearchLe = function(num){
let res = -1;
for(let q=0,p=this.length-1; q <= p; ){
const i = Math.floor((p+q)/2);
if(this[i] == num) { // 返回
// res = i; break;
return i;
} else {
if(this[i] < num){ // 向后找
q = i+1;
} else { // 向前找
res = i;
p = i-1;
}
}
}
return res;
}
20210330 增强功能,参数不仅可以是数字,还可以是函数
// 二分查找, 找到第一个大于等于num的位置 (数组必须从小到大排好序,且不重复)
// 如果参数是函数,比如 fn(x){ return x-num; } 这个是比较函数,
// x==num返回0,x>num返回正数, x<num返回负数
// 一个例子:[{a:1},{a:2},{a:3}].binarySearchLe((x)=>x.a-2) // 返回位置 1
Array.prototype.binarySearchLe = function(numOrFn){
const isFn = typeof numOrFn === "function"; // 判断参数是函数还是数字
let res = -1;
for(let q=0,p=this.length-1; q <= p; ){
const i = Math.floor((p+q)/2);
// this[i] 和 numOrFn 比较的结果
const cmp = isFn? numOrFn(this[i]) : this[i]-numOrFn;
if(cmp === 0) { // 返回
return res = i;
} else {
if(cmp < 0){ // i比num小, 向后找
q = i+1;
} else { // 向前找
res = i;
p = i-1;
}
}
}
return res;
}